home *** CD-ROM | disk | FTP | other *** search
/ Programming a Multiplayer FPS in DirectX / Programming a Multiplayer FPS in DirectX (Companion CD).iso / DirectX / dxsdk_oct2004.exe / dxsdk.exe / Utilities / Content Creation Tool Plug-Ins / Maya / Sources / XExporter.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-09-27  |  101.0 KB  |  4,050 lines

  1.  
  2.  
  3. #include "dxstdafx.h"
  4.  
  5. #include "d3d9.h"
  6. #include "d3dx9.h"
  7.  
  8. #include "MayaInterface.h"
  9. #include "XExporter.h"
  10.  
  11.  
  12. #include "PreviewPipeline.h"
  13. #include "MayaInterface.h"
  14. #include <windows.h>
  15. #include <assert.h>
  16. #include <stdio.h>
  17. #include <memory.h>
  18. #include <string.h>
  19. #include <wchar.h>
  20. #include <stdlib.h>
  21. #include <math.h>
  22. #include <malloc.h>
  23.  
  24. // Maya API
  25. #include <maya/MSelectionList.h>
  26.  
  27. //#include <maya/MFn.h>
  28. //#include <maya/MFnDependencyNode.h>
  29. #include <maya/MObject.h>
  30. #include <maya/MPxNode.h>
  31. #include <maya/MFnDagNode.h>
  32. #include <maya/MDagPath.h>
  33. #include <maya/MDagPathArray.h>
  34. #include <maya/MPlug.h>
  35. #include <maya/MItDag.h>
  36.  
  37. #include <maya/MColor.h>
  38. #include <maya/MMatrix.h>
  39. #include <maya/MQuaternion.h>
  40. #include <maya/MTime.h>
  41.  
  42. #include <maya/MFnMeshData.h>
  43. #include <maya/MIntArray.h>
  44. #include <maya/MFloatArray.h>
  45. #include <maya/MFloatVectorArray.h>
  46. #include <maya/MFloatPointArray.h>
  47. #include <maya/MPointArray.h>
  48. #include <maya/MObjectArray.h>
  49. #include <maya/MDagPathArray.h>
  50. #include <maya/MPlugArray.h>
  51. #include <maya/MFnCompoundAttribute.h>
  52. #include <maya/MFnTypedAttribute.h>
  53. #include <maya/MFnNumericAttribute.h>
  54. #include <maya/MTransformationMatrix.h>
  55. #include <maya/MFnMatrixAttribute.h>
  56. #include <maya/MSceneMessage.h>
  57. #include <maya/MDGMessage.h>
  58. #include <maya/MNodeMessage.h>
  59. #include <maya/MDagMessage.h>
  60. #include <maya/MEventMessage.h>
  61. #include <maya/MFnCamera.h>
  62. #include <maya/MAnimMessage.h>
  63.  
  64. //#include <maya/MSimple.h>
  65. //#include <maya/MEulerRotation.h>
  66. //#include <maya/MIkSystem.h>
  67.  
  68. #include <maya/MAnimControl.h>
  69. #include <maya/MAnimUtil.h>
  70.  
  71. #include <maya/MFnTransform.h>
  72. #include <maya/MFnIKJoint.h>
  73. #include <maya/MFnMesh.h>
  74. #include <maya/MFnNurbsSurface.h>
  75. #include <maya/MFnSubd.h>
  76. #include <maya/MFnLambertShader.h>
  77. #include <maya/MFnBlinnShader.h>
  78. #include <maya/MFnPhongShader.h>
  79. #include <maya/MFnSkinCluster.h>
  80. #include <maya/MFnWeightGeometryFilter.h>
  81. #include <maya/MFnBlendShapeDeformer.h>
  82. #include <maya/MFnMatrixData.h>
  83. #include <maya/MFnSet.h>
  84. #include <maya/MFnDoubleArrayData.h>
  85. #include <maya/MFnStringData.h>
  86.  
  87. #include <maya/MItDag.h>
  88. #include <maya/MItSelectionList.h>
  89. #include <maya/MItDependencyGraph.h>
  90. #include <maya/MItDependencyNodes.h>
  91. #include <maya/MItGeometry.h>
  92. #include <maya/MItMeshPolygon.h>
  93. #include <maya/MItMeshVertex.h>
  94. #include <maya/MItMeshFaceVertex.h>
  95.  
  96.  
  97. CRITICAL_SECTION DeviceAndViewerSection; 
  98. HANDLE DeviceCreatedEvent; 
  99. //HANDLE CreationSemaphore;
  100. //HANDLE CreationThread;
  101. //HANDLE UpdateThread;
  102.  
  103. CMayaPreviewPipeline g_PreviewPipeline;
  104.  
  105. struct _MeshGlobal
  106. {
  107.     CAtlArray<DWORD>                D3DPointReps;
  108.     CAtlArray<VertexD3DToMayaType>    VertexD3DToMaya;
  109.     CAtlArray<VertexMayaToD3DType>    VertexMayaToD3D;
  110.  
  111. } MeshGlobal;
  112.  
  113.  
  114. CMayaPreviewPipeline::CMayaPreviewPipeline()
  115. {
  116.     new(&TagContainer) DCCTagContainer(this);
  117. };
  118.  
  119. CMayaPreviewPipeline::~CMayaPreviewPipeline()
  120. {
  121. }; 
  122.  
  123. HRESULT CMayaPreviewPipeline::Synchronize_Material(DXCCHANDLE hDirtyShader)
  124. {
  125.     HRESULT hr= S_OK;
  126.     MStatus stat= MS::kSuccess;
  127.  
  128.     MObject node= Convert_DXCCResourceToDGNode(hDirtyShader);
  129.     if(!node.isNull())
  130.     {
  131.         for(MItDependencyGraph FindEngine(node, MFn::kShadingEngine, MItDependencyGraph::kDownstream );
  132.             !FindEngine.isDone();
  133.             FindEngine.next())
  134.         {
  135.             MObject dgShadingEngine= FindEngine.thisNode();
  136.  
  137.             if(!dgShadingEngine.isNull())
  138.             {
  139.  
  140.  
  141.  
  142.                 for(MItDependencyGraph FindMesh(dgShadingEngine, MFn::kMesh, MItDependencyGraph::kUpstream);
  143.                     !FindMesh.isDone();
  144.                     FindMesh.next())
  145.                 {
  146.                     MObject dgMesh= FindMesh.thisNode();
  147.                     if(!dgMesh.isNull())
  148.                     {
  149.                         MDagPathArray PathArray;
  150.  
  151.                         MDagPath::getAllPathsTo(dgMesh, PathArray);
  152.                         for(UINT iPath= 0; iPath < PathArray.length(); iPath++)
  153.                         {
  154.                             DCCTag* tag= NULL;
  155.                             if(TagContainer.Find(PathArray[iPath], NULL, &tag))
  156.                             {
  157.                                 TagContainer.MarkAsDirty(tag);
  158.                             }
  159.                         }
  160.                     }
  161.                 }
  162.  
  163.  
  164.             }
  165.         }
  166.     }
  167.     return hr;
  168. }
  169.  
  170. MObject CMayaPreviewPipeline::Convert_DXCCResourceToDGNode(DXCCHANDLE matchHandle)
  171. {
  172.     for(MItDependencyNodes iter; !iter.isDone(); iter.next())
  173.     {
  174.         MFnDependencyNode depNode(iter.item());
  175.         if(depNode.typeId() == DirectXShader::id)
  176.         {
  177.             int iHandle;
  178.             DXCCHANDLE hHandle; 
  179.  
  180.             MPlug plugResource= depNode.findPlug(DirectXShader::aDXCCHandle);
  181.  
  182.             plugResource.getValue(iHandle);
  183.             hHandle= (DXCCHANDLE)iHandle;
  184.  
  185.             if(hHandle == matchHandle)
  186.             {
  187.                 return iter.item();
  188.             }
  189.         }
  190.     }
  191.  
  192.     return MObject();
  193. }
  194.  
  195.  
  196. DXCCHANDLE CMayaPreviewPipeline::Convert_DGNodeToDXCCResource(MObject matchNode)
  197. {
  198.     MFnDependencyNode depNode(matchNode);
  199.     if(depNode.typeId() == DirectXShader::id)
  200.     {
  201.         int iHandle;
  202.         DXCCHANDLE hHandle; 
  203.  
  204.         MPlug plugResource= depNode.findPlug(DirectXShader::aDXCCHandle);
  205.  
  206.         plugResource.getValue(iHandle);
  207.         hHandle= (DXCCHANDLE)iHandle;
  208.  
  209.         return hHandle;
  210.     }
  211.  
  212.     return NULL;
  213. }
  214.  
  215.  
  216.  
  217.  
  218. HRESULT CDXCCSaveEffectDefaults::Set(LPDXCCMANAGER pResourceManager, /*MObject& attribParameters,*/ MObject& pxNode)
  219. {
  220.     if(!pResourceManager)
  221.         return E_INVALIDARG;
  222.  
  223.     if(pxNode.isNull())
  224.         return E_INVALIDARG;
  225.  
  226.     //if(attribParameters.isNull())
  227.     //    return E_INVALIDARG;
  228.  
  229.     pManager= pResourceManager;
  230.     oNode= pxNode;
  231.     //aEffectParameters= attribParameters;
  232.     iParameter= 0;
  233.  
  234.     return S_OK;
  235. };
  236.  
  237. HRESULT CDXCCSaveEffectDefaults::EnumParameter(LPD3DXEFFECT pEffect, PathInfo& parameter)
  238. {
  239.     HRESULT hr= S_OK;
  240.     MStatus stat= MS::kSuccess;
  241.  
  242.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  243.  
  244.     bool Valid= false;
  245.     MPlug plugName;
  246.     MFnTypedAttribute aParamName;
  247.     MFnTypedAttribute aParamValue;
  248.     MObject oParamValue;
  249.     MFnDependencyNode depNode(oNode);
  250.     FLOAT fArray[16];
  251.  
  252.     if(!pManager)
  253.         return E_UNEXPECTED;
  254.  
  255.     if(oNode.isNull())
  256.         return E_INVALIDARG;
  257.  
  258.  
  259.     MString ShortParamName( MString(DX_SHORT_FXPARAM_NAME) + iParameter);
  260.     MString LongParamName( MString(DX_LONG_FXPARAM_NAME) + iParameter);
  261.     MString ShortDataName( MString(DX_SHORT_FXPARAM_DATA) + iParameter);
  262.     MString LongDataName( MString(DX_LONG_FXPARAM_DATA) + iParameter);
  263.  
  264.  
  265.     plugName= depNode.findPlug(LongParamName);
  266.     if(plugName.isNull())
  267.     {
  268.         MObject oParamName= aParamName.create(LongParamName, ShortParamName, MFnData::kString, MObject::kNullObj , &stat);
  269.         if(MAYA_FAILED(stat))
  270.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  271.  
  272.         CHECK_MSTATUS( aParamName.setHidden( true ) );
  273.  
  274.         stat = depNode.addAttribute(oParamName);
  275.         if(MAYA_FAILED(stat))
  276.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  277.  
  278.         plugName= depNode.findPlug(LongParamName, &stat);
  279.         if(MAYA_FAILED(stat))
  280.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  281.     }
  282.  
  283.     switch(parameter.Description.Class)
  284.     {
  285.     case D3DXPC_SCALAR:
  286.     case D3DXPC_VECTOR:
  287.     case D3DXPC_MATRIX_ROWS:
  288.     case D3DXPC_MATRIX_COLUMNS:
  289.         {
  290.             DXCC_ASSERT_EXCEPTIONS_BEGIN()
  291.             {
  292.  
  293.                 MFnDoubleArrayData dArrayData;
  294.                 MDoubleArray dArray;
  295.                 MObject oData;
  296.  
  297.                 hr= pEffect->GetFloatArray(parameter.MyHandle(), fArray, 16);
  298.                 if(DXCC_FAILED(hr))
  299.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  300.  
  301.                 oData= dArrayData.create(&stat);
  302.                 dArray= dArrayData.array();
  303.                 switch(parameter.Description.Class)
  304.                 {
  305.                     case D3DXPC_SCALAR:
  306.                         {
  307.                             dArray.setLength(1);
  308.                             dArray.set(fArray[0], 0);
  309.                         }
  310.                         break;
  311.                     case D3DXPC_VECTOR:
  312.                         {
  313.                             dArray.setLength(4);
  314.                             for(UINT i= 0; i < 4; i++)
  315.                                 dArray.set(fArray[i], i);
  316.                         }
  317.                         break;                
  318.                     case D3DXPC_MATRIX_ROWS:
  319.                     case D3DXPC_MATRIX_COLUMNS:
  320.                         {
  321.                             dArray.setLength(16);
  322.                             for(UINT i= 0; i < 16; i++)
  323.                                 dArray.set(fArray[i], i);
  324.                         }
  325.                         break;    
  326.                 };
  327.  
  328.                 MPlug plugData= depNode.findPlug(LongDataName);
  329.                 if(plugData.isNull())
  330.                 {
  331.                     oParamValue= aParamValue.create(LongDataName, ShortDataName, MFnData::Type::kDoubleArray, MObject::kNullObj, &stat);
  332.                     if (!stat)
  333.                     {
  334.                         stat.perror("Failed to create Parameter Attribute");
  335.                         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  336.                     }
  337.                     CHECK_MSTATUS( aParamValue.setHidden( true ) );
  338.                     depNode.addAttribute(oParamValue);
  339.                     plugData= depNode.findPlug(LongDataName);
  340.                 }
  341.                 plugData.setValue(oData);
  342.                 Valid= true;
  343.  
  344.  
  345.             }
  346.             DXCC_ASSERT_EXCEPTIONS_END()
  347.         }
  348.         break;
  349.     case D3DXPC_OBJECT:
  350.         switch(parameter.Description.Type)
  351.         {
  352.         case D3DXPT_STRING:
  353.             {
  354.  
  355.                 DXCC_ASSERT_EXCEPTIONS_BEGIN()
  356.                 {
  357.  
  358.                     MFnStringData StringData;
  359.                     MObject oData;
  360.                     LPCSTR pStr= NULL;
  361.         
  362.                     hr= pEffect->GetString(parameter.MyHandle(), &pStr);
  363.                     if(DXCC_FAILED(hr))
  364.                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  365.                     
  366.                     if(!pStr)
  367.                         pStr= "";
  368.  
  369.                     oData= StringData.create(MString(pStr), &stat);
  370.                     if (!stat)
  371.                     {
  372.                         stat.perror("Failed to create StringData");
  373.                         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  374.                     }
  375.  
  376.                     MPlug plugData= depNode.findPlug(LongDataName);
  377.                     if(plugData.isNull())
  378.                     {
  379.                         oParamValue= aParamValue.create(LongDataName, ShortDataName, MFnData::Type::kString, MObject::kNullObj, &stat);
  380.                         if (!stat)
  381.                         {
  382.                             stat.perror("Failed to create Parameter Attribute");
  383.                             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  384.                         }
  385.                         CHECK_MSTATUS( aParamValue.setHidden( true ) );
  386.                         depNode.addAttribute(oParamValue);
  387.                         plugData= depNode.findPlug(LongDataName);
  388.                     }
  389.                     plugData.setValue(oData);
  390.                     Valid= true;
  391.  
  392.                 }
  393.                 DXCC_ASSERT_EXCEPTIONS_END()
  394.  
  395.             }
  396.             break;
  397.         case D3DXPT_TEXTURE:
  398.         case D3DXPT_TEXTURE1D:
  399.         case D3DXPT_TEXTURE2D:
  400.         case D3DXPT_TEXTURE3D:
  401.         case D3DXPT_TEXTURECUBE:
  402.             {
  403.                 DXCC_ASSERT_EXCEPTIONS_BEGIN()
  404.                 {
  405.  
  406.                     MFnStringData StringData;
  407.                     MObject oData;
  408.                     LPDXCCRESOURCE pRes= NULL;
  409.                     LPDIRECT3DBASETEXTURE9 pTexture= NULL;
  410.  
  411.                     hr= pEffect->GetTexture(parameter.MyHandle(), &pTexture);
  412.                     if(DXCC_FAILED(hr))
  413.                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  414.                     
  415.                     if(pTexture 
  416.                         && DXCC_SUCCEEDED(pManager->FindResourceByPointer(pTexture, NULL, &pRes)))
  417.                     {
  418.                         MPlug plugData= depNode.findPlug(LongDataName);
  419.                         LPCSTR pStr= pRes->GetResourcePath();
  420.  
  421.                         if(!pStr)
  422.                             pStr= "";
  423.  
  424.                         oData= StringData.create(MString(pStr), &stat);
  425.                         if (!stat)
  426.                         {
  427.                             stat.perror("Failed to create StringData");
  428.                             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  429.                         }
  430.  
  431.                         if(plugData.isNull())
  432.                         {
  433.                             oParamValue= aParamValue.create(LongDataName, ShortDataName, MFnData::Type::kString, MObject::kNullObj, &stat);
  434.                             if (!stat)
  435.                             {
  436.                                 stat.perror("Failed to create Parameter Attribute");
  437.                                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  438.                             }
  439.                             CHECK_MSTATUS( aParamValue.setHidden( true ) );
  440.                             depNode.addAttribute(oParamValue);
  441.                             plugData= depNode.findPlug(LongDataName);
  442.                         }
  443.                         plugData.setValue(oData);
  444.                         Valid= true;
  445.                     }
  446.                 }
  447.                 DXCC_ASSERT_EXCEPTIONS_END()
  448.             }
  449.             break;
  450.         default:
  451.             break;
  452.         };
  453.         break;
  454.     default:
  455.         break;
  456.     };
  457.  
  458.  
  459.     if(Valid)
  460.     {
  461.         plugName.setValue(parameter.MyName());
  462.         iParameter++;
  463.     }
  464.  
  465.  
  466.     DXCC_ASSERT_EXCEPTIONS_END()
  467.  
  468. e_Exit:    
  469.  
  470.  
  471.     return hr;
  472. }
  473.  
  474. bool 
  475. DAGIsVisible(
  476.     MDagPath& dagPath, 
  477.     MStatus* status)
  478. {
  479.     bool result= true;
  480.     MDagPath path= dagPath;
  481.     MFnDagNode dagNode(path);
  482.  
  483.     if(path.node().hasFn(MFn::kManipulator3D))
  484.         return FALSE;
  485.  
  486.     do
  487.     {
  488.         if( !NodeIsVisible( path.node(), status))
  489.             return false;
  490.     } while( path.pop());
  491.  
  492.     return true;
  493.  
  494.  
  495.     return result;
  496. }
  497.  
  498. bool 
  499. NodeIsVisible(
  500.     MObject& node,
  501.     MStatus* status)
  502. {
  503.     HRESULT    hr= S_OK;
  504.     MStatus TempStatus;
  505.  
  506.     if(!status)
  507.         status= &TempStatus;
  508.     
  509.         
  510.     MFnDagNode DagNode(node); 
  511.  
  512.     bool    bIsVisible= false;
  513.  
  514.     bool    bPlugVisibility= true, 
  515.             bPlugLodVisibility= true, 
  516.             bPlugOverrideEnabled= false, 
  517.             bPlugOverrideVisibility= true,
  518.             bPlugIntermediate= false,
  519.             bPlugUnderworld= false;
  520.  
  521.     MPlug    mpVisibility,
  522.             mpLodVisibility,
  523.             mpOverrideEnabled, 
  524.             mpOverrideVisibility;
  525.             //mpIntermediate;
  526.  
  527.     //VISIBILITY
  528.     mpVisibility = DagNode.findPlug("visibility", status); // intermediateObject //template (these too?)
  529.     if(!*status)
  530.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  531.  
  532.     *status = mpVisibility.getValue(bPlugVisibility);
  533.     if(!*status)
  534.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  535.  
  536.     //LOD VISIBILITY
  537.     mpLodVisibility = DagNode.findPlug("lodVisibility", status);
  538.     if(!*status)
  539.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  540.  
  541.     *status = mpLodVisibility.getValue(bPlugLodVisibility);
  542.     if(!*status)
  543.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  544.  
  545.     //Intermediate Object
  546.     //mpIntermediate = DagNode.findPlug("intermediateObject", status);
  547.     //if(!*status)
  548.     //    DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  549.  
  550.     //*status = mpIntermediate.getValue(bPlugIntermediate);
  551.     //if(!*status)
  552.     //    DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  553.  
  554.     bPlugIntermediate= DagNode.isIntermediateObject();
  555.     bPlugUnderworld= DagNode.inUnderWorld();
  556.  
  557.     //OVERRIDE ENABLED
  558.     mpOverrideEnabled = DagNode.findPlug("overrideEnabled", status);
  559.     if(!*status)
  560.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  561.  
  562.     *status = mpOverrideEnabled.getValue(bPlugOverrideEnabled);
  563.     if(!*status)
  564.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  565.  
  566.     //OVERRIDE VISIBILITY
  567.     mpOverrideVisibility = DagNode.findPlug("overrideVisibility", status);
  568.     if(!*status)
  569.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  570.  
  571.     *status = mpOverrideVisibility.getValue(bPlugOverrideVisibility);
  572.     if(!*status)
  573.         DXCC_STATUS_EXIT(*status, MS::kFailure, e_Exit, FALSE);
  574.  
  575.     bIsVisible= bPlugVisibility
  576.         && bPlugLodVisibility 
  577.         && !bPlugIntermediate
  578.         && !bPlugUnderworld 
  579.         && !(bPlugOverrideEnabled && !bPlugOverrideVisibility);
  580.  
  581. e_Exit:
  582.  
  583.     return bIsVisible;    
  584. };
  585.  
  586. UINT MayaGetFPS()
  587. {
  588.     UINT nFPS;    // num frames per second
  589.  
  590.     // calculate the frames per second
  591.     switch(MTime::uiUnit()) 
  592.     {
  593.         case MTime::kSeconds:        // 1 fps
  594.             nFPS = 1;
  595.             break;
  596.         case MTime::kMilliseconds:    // 1000 fps
  597.             nFPS = 1000;
  598.             break;
  599.         case MTime::kGames:            // 15 fps
  600.             nFPS = 15;
  601.             break;
  602.         case MTime::kFilm:            // 24 fps
  603.             nFPS = 24;
  604.             break;
  605.         case MTime::kPALFrame:        // 25 fps
  606.             nFPS = 25;
  607.             break;
  608.         case MTime::kNTSCFrame:        // 30 fps
  609.             nFPS = 30;
  610.             break;
  611.         case MTime::kShowScan:        // 48 fps
  612.             nFPS = 48;
  613.             break;
  614.         case MTime::kPALField:        // 50 fps
  615.             nFPS = 50;
  616.             break;
  617.         case MTime::kNTSCField:        // 60 fps
  618.             nFPS = 60;
  619.             break;
  620.         default:
  621.             nFPS = 1;
  622.             break;
  623.     };
  624.  
  625.     return nFPS;
  626. }
  627.  
  628. void ConvertLocalMatrix(D3DXMATRIX& ToD3D, const MFloatMatrix& FromMaya)
  629. {
  630.     for (UINT i = 0; i < 4; i++)
  631.     {
  632.         for (UINT j = 0; j < 4; j++)
  633.         {
  634.             ToD3D(i, j)= (FLOAT)FromMaya(i, j);
  635.         }
  636.     }
  637. }
  638.  
  639. void ConvertLocalMatrix(D3DXMATRIX& ToD3D, const MMatrix& FromMaya)
  640. {
  641.     MFloatMatrix FromMayaFloat(FromMaya.matrix);
  642.     ConvertLocalMatrix(ToD3D, FromMayaFloat);
  643. }
  644.  
  645. void ConvertWorldMatrix(D3DXMATRIX& ToD3D, const MFloatMatrix& FromMaya)
  646. {
  647.     D3DXMATRIX Local;
  648.     ConvertLocalMatrix(Local, FromMaya);
  649.  
  650.     D3DXMATRIX RtoL;
  651.     D3DXMatrixScaling(&RtoL, 1.0f, 1.0f, -1.0f);
  652.     D3DXMatrixMultiply(&ToD3D, &Local, &RtoL);
  653. }
  654.  
  655. void ConvertWorldMatrix(D3DXMATRIX& ToD3D, const MMatrix& FromMaya)
  656. {
  657.     MFloatMatrix FromMayaFloat(FromMaya.matrix);
  658.     ConvertWorldMatrix(ToD3D, FromMayaFloat);
  659. }
  660.  
  661. bool DCCTagContainer::Add(MObject& objAllPathsTo )
  662. {
  663.     MDagPathArray PathArray;
  664.  
  665.     if(objAllPathsTo.isNull())
  666.         return false;
  667.  
  668.     MDagPath::getAllPathsTo(objAllPathsTo, PathArray);
  669.     for(UINT iPath= 0; iPath < PathArray.length(); iPath++)
  670.     {
  671.         Add(PathArray[iPath], NULL, NULL);
  672.     }
  673.  
  674.     return true;
  675. }
  676.  
  677. bool DCCTagContainer::Add(MDagPath& path, UINT *pIndex, DCCTag** ppTag )
  678. {
  679.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  680.  
  681.     if(Find(path, pIndex, ppTag))
  682.         return false;
  683.  
  684.     if(!DAGIsVisible(path, NULL))
  685.         return false;
  686.  
  687.     DCCTag* pTag= new DCCTag(this, path);
  688.     if(!pTag)
  689.         return false;
  690.  
  691.     GlobalArray.push_back(pTag);
  692.  
  693.     MarkAsDirty(Size()-1);
  694.  
  695.  
  696.  
  697.     if(pIndex)
  698.     {
  699.         *pIndex= Size()-1;
  700.     }
  701.  
  702.     if(ppTag)
  703.     {
  704.         *ppTag= pTag;
  705.     }
  706.  
  707.     DXCC_ASSERT_EXCEPTIONS_END()
  708.  
  709.     return true;
  710. }
  711.  
  712. DCCTag::DCCTag(DCCTagContainer* Owner, MDagPath& path)
  713. {
  714.     pContainer= Owner;
  715.     Dirty= false;
  716.     Initialized= false;
  717.     PathCallback= NULL;
  718.     Resource= NULL;
  719.     Interface= NULL;
  720.  
  721.     SetPath(path);
  722.     pContainer->pPreview->AccessManager()->CreateResource(NULL, IID_NULL, true, &Resource);
  723.  
  724.     DXCC_DPFA_REPORT("TAG: %s [%s]",  path.fullPathName ().asChar(), path.node().apiTypeStr());
  725. };
  726.  
  727. DCCTag::~DCCTag()
  728. {
  729.     if(PathCallback != NULL)
  730.         MMessage::removeCallback(PathCallback);
  731.     
  732.     if(Resource)
  733.     {
  734.         if(Interface)
  735.         {
  736.             if(Resource->GetIID() == IID_IDXCCFrame)
  737.             {
  738.                 LPDXCCFRAME pFrame= (LPDXCCFRAME)Interface;
  739.  
  740.                 pFrame->SetParent(NULL);
  741.  
  742.                 while(pFrame->NumChildren() > 0)
  743.                 {
  744.                     pFrame->RemoveChild(pFrame->NumChildren()-1);
  745.                 }
  746.                 
  747.                 while(pFrame->NumMembers() > 0)
  748.                 {
  749.                     pFrame->RemoveMember(pFrame->NumMembers()-1);
  750.                 }
  751.             }
  752.             else if(Resource->GetIID() == IID_IDXCCMesh)
  753.             {
  754.                 LPDXCCMESH pMesh= (LPDXCCMESH)Interface;
  755.  
  756.                 if(pMesh->NumBones() > 0)
  757.                     pMesh->CreateBones(0);
  758.             }
  759.  
  760.             DXCC_RELEASE(Interface);
  761.  
  762.  
  763.  
  764.         }
  765.  
  766.         if(Resource->DetachObject())
  767.         {
  768.             if(pContainer
  769.                 && pContainer->pPreview
  770.                 && pContainer->pPreview->AccessManager())
  771.                 pContainer->pPreview->AccessManager()->RemoveResource(Resource->GetHandle());
  772.         }
  773.  
  774.         DXCC_RELEASE(Resource);
  775.     }
  776.  
  777.  
  778.     
  779.     DXCC_RELEASE(Resource);
  780.     DXCC_RELEASE(Interface);
  781. };
  782.  
  783.  
  784. void DCCTag::SetPath(MDagPath& newPath)
  785. {
  786.     Path.set(newPath);
  787. }
  788.  
  789. MDagPath& DCCTag::GetPath()
  790. {
  791.     if(!Path.isValid())
  792.         Path= MDagPath();
  793.  
  794.     return Path;
  795. }
  796.  
  797. bool DCCTag::IsInitialized()
  798. {
  799.     return (Initialized && IsValid() && Resource && Interface);
  800. }
  801.  
  802. bool DCCTag::IsValid()
  803. {
  804.     return (Path.isValid());
  805. };
  806.  
  807. void DCCTagContainer::EraseInvalidTags()
  808. {
  809.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  810.  
  811.     for(UINT i= 0; 
  812.         i < Size(); 
  813.         i++)
  814.     {
  815.         DCCTag* pTag= NULL;
  816.         Get(i, pTag);
  817.  
  818.         if(!pTag->IsValid())
  819.         {
  820.             Erase(i);
  821.             i--;
  822.         }
  823.     }
  824.  
  825.     DXCC_ASSERT_EXCEPTIONS_END()
  826.  
  827.     return;
  828. }
  829.  
  830.  
  831. bool DCCTagContainer::Get(UINT index, DCCTag* &pTag)
  832. {
  833.     if(index < Size())
  834.     {
  835.         pTag= GlobalArray[index];
  836.         return true;
  837.     }
  838.     else
  839.         return false;
  840. }
  841.  
  842. bool DCCTagContainer::GetFromDirtyList(UINT index, DCCTag* &pTag)
  843. {
  844.     if(index < Size())
  845.     {
  846.         pTag= DirtyArray[index];
  847.         return true;
  848.     }
  849.     else
  850.         return false;
  851. }
  852.  
  853. UINT DCCTagContainer::SizeFromDirtyList()
  854. {
  855.     return (UINT)DirtyArray.size();
  856. }
  857.  
  858. bool DCCTagContainer::FindFromDirtyList(DCCTag* pFind, UINT *pDirtyListIndex)
  859. {
  860.     for(UINT i= 0; 
  861.         i < SizeFromDirtyList(); 
  862.         i++)
  863.     {
  864.         DCCTag* pTag= NULL;
  865.         GetFromDirtyList(i, pTag);
  866.  
  867.         if(pTag == pFind)
  868.         {
  869.             *pDirtyListIndex= i;
  870.             return true;
  871.         }
  872.     }
  873.  
  874.     return false;
  875. }
  876.  
  877. bool DCCTagContainer::Find(DCCTag* pFind, UINT *pIndex)
  878. {
  879.     for(UINT i= 0; 
  880.         i < Size(); 
  881.         i++)
  882.     {
  883.         DCCTag* pTag= NULL;
  884.         Get(i, pTag);
  885.  
  886.         if(pTag == pFind)
  887.         {
  888.             *pIndex= i;
  889.             return true;
  890.         }
  891.     }
  892.  
  893.     return false;
  894. }
  895.  
  896. bool DCCTagContainer::Find(MDagPath& path, UINT *pIndex, DCCTag** ppTag)
  897. {
  898.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  899.  
  900.     for(UINT i= 0; 
  901.         i < Size(); 
  902.         i++)
  903.     {
  904.         DCCTag* pTag= NULL;
  905.         Get(i, pTag);
  906.  
  907.         if(pTag->GetPath() == path)
  908.         {
  909.             if(pIndex)
  910.                 *pIndex= i;
  911.             if(ppTag)
  912.                 *ppTag= pTag;
  913.  
  914.             return true;
  915.         }
  916.     }
  917.  
  918.     DXCC_ASSERT_EXCEPTIONS_END()
  919.  
  920.     return false;
  921. }
  922.  
  923.  
  924. bool DCCTagContainer::FindFromDirtyList(MDagPath& path, UINT *pIndex, DCCTag** ppTag)
  925. {
  926.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  927.  
  928.     for(UINT i= 0; 
  929.         i < SizeFromDirtyList(); 
  930.         i++)
  931.     {
  932.         DCCTag* pTag= NULL;
  933.         GetFromDirtyList(i, pTag);
  934.  
  935.         if(pTag->GetPath() == path)
  936.         {
  937.             if(pIndex)
  938.                 *pIndex= i;
  939.             if(ppTag)
  940.                 *ppTag= pTag;
  941.  
  942.             return true;
  943.         }
  944.     }
  945.  
  946.     DXCC_ASSERT_EXCEPTIONS_END()
  947.  
  948.     return false;
  949. }
  950.  
  951.  
  952. UINT DCCTagContainer::Size()
  953. {
  954.     return (UINT)GlobalArray.size();
  955. }
  956.  
  957.  
  958. void DCCTagContainer::EraseAll()
  959. {
  960.     if(GlobalArray.size() > 0)
  961.     {
  962.         for(UINT i= 0; i < GlobalArray.size(); i++)
  963.         {
  964.             DCCTag* Element= GlobalArray[i];
  965.             delete Element;
  966.         }
  967.         GlobalArray.clear();
  968.     }
  969.     DirtyArray.clear();
  970. }
  971.  
  972. bool DCCTagContainer::Erase_SLOW(DCCTag* tag)
  973. {
  974.     UINT i= (UINT)-1;
  975.     if(Find(NULL, &i))
  976.     {
  977.         return Erase(i);
  978.     }
  979.     return false;
  980. }
  981.  
  982. bool DCCTagContainer::Erase(UINT index)
  983. {
  984.     if(index < GlobalArray.size())
  985.     {
  986.         DCCTag* &Element= GlobalArray[index];
  987.  
  988.         MarkAsClean_SLOW(Element);
  989.  
  990.         delete Element;
  991.  
  992.         GlobalArray.erase(GlobalArray.begin()+index);
  993.  
  994.         return true;
  995.     }
  996.     return false;
  997. }
  998.  
  999. HRESULT    
  1000. CMayaPreviewPipeline::Scene_Export(
  1001.             const char* file,        // save file object
  1002.             const char* options,    // options string
  1003.             MPxFileTranslator::FileAccessMode mode)
  1004. {
  1005.      HRESULT hr = S_OK;
  1006.     MStatus stat = MS::kSuccess;
  1007.     CPipelineLock SceneLock;
  1008.  
  1009.     SceneWriteLock(true, SceneLock);
  1010.  
  1011.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1012.  
  1013.     DXCC_DPF(TEXT("Maya XFile Exporter"));
  1014.     DXCC_DPF(TEXT("Copyright (C) 1998-2000 Microsoft Corporation. All Rights Reserved."));
  1015.     DXCC_DPFA("Exporting to \"%s\"...", file);
  1016.  
  1017. #ifdef _XBOX_
  1018.     Scene_Deregister();
  1019.     Scene_Register();
  1020. #endif
  1021.  
  1022.     hr= DXCCSaveScene(
  1023.             file, 
  1024.             D3DXF_FILEFORMAT_TEXT,//D3DXF_FILEFORMAT_BINARY,//
  1025.             AccessManager(), 
  1026.             AccessRoot(), 
  1027.             NULL, 
  1028.             NULL, 
  1029.             NULL);
  1030.     if (DXCC_FAILED(hr))
  1031.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  1032.  
  1033.     DXCC_ASSERT_EXCEPTIONS_END()
  1034.  
  1035. e_Exit:
  1036.  
  1037.     SceneWriteUnlock(SceneLock);
  1038.  
  1039.     return hr;
  1040. }
  1041.  
  1042. //HRESULT    
  1043. //CMayaPreviewPipeline::Export_Options(
  1044. //            const char* file,        // save file object
  1045. //            const char* options,    // options string
  1046. //            MPxFileTranslator::FileAccessMode mode)
  1047. //{
  1048. //        //OPTIONS INITIALIZE
  1049. //        //Options.Hierarchy= TRUE;
  1050. //        //Options.HierarchyCentered= FALSE;
  1051. //        //Options.HierarchyScale.x= 1.0f;
  1052. //        //Options.HierarchyScale.y= 1.0f;
  1053. //        //Options.HierarchyScale.z= 1.0f;
  1054. //
  1055. //        //Options.Mesh= TRUE;
  1056. //        //Options.MeshSkinned= TRUE;
  1057. //
  1058. //        //Options.Material= TRUE;
  1059. //        //Options.MaterialFX= TRUE; 
  1060. //        //Options.MaterialUnqualifyPath= FALSE; 
  1061. //
  1062. //        //Options.Animation= TRUE;
  1063. //        //Options.AnimationController= NULL;
  1064. //        //strcpy(Options.AnimationName, "default");
  1065. //        //Options.AnimationKeysOnly= FALSE;
  1066. //        //Options.AnimationPlaybackType= D3DXPLAY_ONCE;
  1067. //        //Options.AnimationPlayFPS= Options.AnimationSampleFPS= MayaGetFPS();
  1068. //        //Options.AnimationStartTime= MAnimControl::minTime().value(); 
  1069. //        //Options.AnimationEndTime= (DOUBLE)MAnimControl::maxTime().value();
  1070. //
  1071. //        //Options.OutputFormat= D3DXF_FILEFORMAT_BINARY;//D3DXF_FILEFORMAT_TEXT;//
  1072. //        //strcpy(Options.OutputSaveAs, file);
  1073. //    }//END//OPTIONS INITIALIZE
  1074. //
  1075. //
  1076. //
  1077. //    //hr= DXCCShowSaveDialog(&Options);
  1078. //    //if (DXCC_FAILED(hr))
  1079. //    //    DXCC_GOTO_EXIT(e_Exit, TRUE);
  1080. //}
  1081.  
  1082.  
  1083.  
  1084.  
  1085. void CMayaPreviewPipeline::Scene_Update(bool bForceUpdate)
  1086. {
  1087.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1088.  
  1089.  
  1090.     DXCCTimeStamp TimeStamp;
  1091.     CPipelineLock SceneLock;    
  1092.  
  1093.     if(!bForceUpdate)
  1094.     {
  1095.         if(TimeStamp.RoughlyEqual(TagContainer.TimeStamp))
  1096.             return;
  1097.     }
  1098.  
  1099.     //always update the camera...when enough time has passed
  1100.     Synchronize_PerspectiveCamera();
  1101.  
  1102.     if(    TagContainer.SizeFromDirtyList() > 0 || 
  1103.         DirtyShaders.size() > 0)
  1104.     {
  1105.         SceneWriteLock(true, SceneLock);
  1106.         MGlobal::displayInfo("DXCC BEGINNING TO COPY SCENE");
  1107.  
  1108.         //update materials since dirty materials will make dirty meshes
  1109.         Scene_Update_Materials(bForceUpdate, TimeStamp);
  1110.  
  1111.         //remove any invisible nodes which are dirty
  1112.         Scene_Update_Visibility(bForceUpdate, TimeStamp);
  1113.  
  1114.         //update the frames since meshes rely on them
  1115.         Scene_Update_Tags(bForceUpdate, TimeStamp, MFn::kTransform);
  1116.  
  1117.         //update meshes 
  1118.         Scene_Update_Tags(bForceUpdate, TimeStamp, MFn::kMesh);
  1119.  
  1120.         MGlobal::displayInfo("DXCC FINISHED COPYING SCENE");
  1121.         SceneWriteUnlock(SceneLock);
  1122.     }
  1123.  
  1124.     //always update the timeso that we know it's been long enough 
  1125.     //between updates ....NOTE this is at the end to garantee usable time 
  1126.     //rather than maintaining interactive rates
  1127.     //TODO: track and avg time of updates and and throttle the values in RoughlyEquals 
  1128.     //instead to smooth out interaction.
  1129.     TimeStamp.AcquireTime();
  1130.  
  1131.     DXCC_ASSERT_EXCEPTIONS_END()
  1132.  
  1133.     return;
  1134. }
  1135.  
  1136.  
  1137. void CMayaPreviewPipeline::Scene_Update_Animation()
  1138. {
  1139.     HRESULT hr= S_OK;
  1140.  
  1141.     for(UINT iDirty= 0; 
  1142.         iDirty < TagContainer.Size();
  1143.         iDirty++)
  1144.     {
  1145.         DCCTag* pTag= NULL;
  1146.  
  1147.         if(!TagContainer.Get(iDirty, pTag))
  1148.             continue;
  1149.  
  1150.         //for realtime attempts at tracking animation.//not using this approach
  1151.         //if(pTag->DirtyAnimationFlag)
  1152.         //we're just going to regather everything regardless of being dirty
  1153.         //pTag->DirtyAnimationFlag= false;
  1154.  
  1155.         Frame_GatherAnimation(pTag);//ok if this fails
  1156.  
  1157.     }
  1158.  
  1159. //e_Exit:
  1160.     return;
  1161. }
  1162.  
  1163. void CMayaPreviewPipeline::Scene_Update_Visibility(bool bForceUpdate, DXCCTimeStamp& TimeStamp)
  1164. {
  1165.     HRESULT hr= S_OK;
  1166.     MStatus stat = MS::kSuccess;
  1167.  
  1168.     UINT CleanedCount= 0;
  1169.     UINT DirtyCount= TagContainer.SizeFromDirtyList();
  1170.     for(UINT i= 0; 
  1171.         i < DirtyCount;
  1172.         i++)
  1173.     {
  1174.         DCCTag* pTag= NULL;
  1175.  
  1176.         UINT iDirty= i-CleanedCount;
  1177.  
  1178.         if(!TagContainer.GetFromDirtyList(iDirty, pTag))
  1179.             continue;
  1180.  
  1181.         if(!bForceUpdate)
  1182.         {
  1183.             if(TimeStamp.RoughlyEqual(pTag->TimeStamp))
  1184.                 continue;
  1185.         }
  1186.  
  1187.         if(pTag->IsInitialized())
  1188.         {
  1189.             MDagPath path= pTag->GetPath();
  1190.  
  1191.             if(!DAGIsVisible(path, &stat))
  1192.             {
  1193.                 Tag_Remove(path.node());
  1194.                 CleanedCount++;
  1195.             }
  1196.         }
  1197.     }
  1198. }
  1199.  
  1200. void CMayaPreviewPipeline::Scene_Update_Tags(bool bForceUpdate, DXCCTimeStamp& TimeStamp, MFn::Type type)
  1201. {
  1202.     UINT CleanedCount= 0;
  1203.     UINT DirtyCount= TagContainer.SizeFromDirtyList();
  1204.     for(UINT i= 0; 
  1205.         i < DirtyCount;
  1206.         i++)
  1207.     {
  1208.         DCCTag* pTag= NULL;
  1209.  
  1210.         UINT iDirty= i-CleanedCount;
  1211.  
  1212.         if(!TagContainer.GetFromDirtyList(iDirty, pTag))
  1213.             continue;
  1214.  
  1215.         //skip tags that to recent unless we are forced to do so
  1216.         if(!bForceUpdate)
  1217.         {
  1218.             if(TimeStamp.RoughlyEqual(pTag->TimeStamp))
  1219.                 continue;
  1220.         }
  1221.     
  1222.         //skip tags that maya throws exception for when i try to initialize
  1223.         if(pTag->CanInitialize())        
  1224.         {
  1225.             bool InitializeMe= !pTag->IsInitialized();
  1226.             MDagPath dagTag= pTag->GetPath();
  1227.  
  1228.             //skip tags that are not of the desired type
  1229.             switch(type)
  1230.             {
  1231.             case MFn::kMesh:
  1232.                 if(!dagTag.hasFn(MFn::kMesh))
  1233.                     continue;
  1234.                 break;
  1235.             case MFn::kTransform:
  1236.                 if(dagTag.hasFn(MFn::kMesh))//in future kShape
  1237.                     continue;
  1238.                 break;
  1239.             };
  1240.             
  1241.             if(InitializeMe)
  1242.                 DXCC_DPFA_REPORT("INITIALIZE TAG: %s", dagTag.fullPathName().asChar());
  1243.  
  1244.  
  1245.             Synchronize_Tag(pTag);
  1246.  
  1247.             //parent because we arent in the tree yet!
  1248.             //rechild because we cant garantee the ordering from maya.
  1249.             //EX FOR RECHILD: the child may be added and the parent may not exist at that time
  1250.             //so it gets added the the global parent.
  1251.             //then the parent gets added and if you dont rechild the hierarchy is wrong.
  1252.             if(InitializeMe)
  1253.             {
  1254.                 MDagPath dagParent= dagTag;
  1255.                 dagParent.pop();
  1256.  
  1257.                 for(UINT iChild= 0; iChild < dagTag.childCount(); iChild++)
  1258.                 {
  1259.                     MDagPath dagChild= dagTag;
  1260.                     dagChild.push(dagTag.child(iChild));
  1261.  
  1262.                     Tag_Reparent(MDagMessage::DagMessage::kParentAdded,dagChild, dagTag, false);
  1263.                 }
  1264.                 Tag_Reparent(MDagMessage::DagMessage::kParentAdded,dagTag, dagParent, false);
  1265.  
  1266.                 pTag->SetInitialized(true);
  1267.             }
  1268.  
  1269.             //We cleaned the tag!
  1270.             TagContainer.MarkAsClean(iDirty);
  1271.  
  1272.             CleanedCount++;
  1273.         }
  1274.     }
  1275. }
  1276.  
  1277. void CMayaPreviewPipeline::Scene_Update_Materials(bool bForceUpdate, DXCCTimeStamp& TimeStamp)
  1278. {
  1279.     if(DirtyShaders.size() > 0)
  1280.     {
  1281.  
  1282.         for(UINT iDirty = 0; iDirty < DirtyShaders.size(); iDirty++)
  1283.         {
  1284.             //materials should respond quickly so we are not throttling them by RoughlyEquals
  1285.  
  1286.             Synchronize_Material(DirtyShaders[iDirty]);
  1287.         }
  1288.         DirtyShaders.clear();
  1289.     }
  1290. }
  1291.  
  1292. bool DCCTag::CanInitialize()
  1293. {
  1294.     HRESULT hr= S_OK;
  1295.     MStatus stat= MS::kSuccess;
  1296.     MDagPath TagDP= GetPath();
  1297.     MFnDependencyNode depNode(TagDP.node());
  1298.  
  1299.     if(TagDP.node().hasFn(MFn::kMesh))
  1300.     {
  1301.         try
  1302.         {
  1303.             MFnMesh mesh(TagDP.node(), &stat);
  1304.             if(MAYA_FAILED(stat))//don't place hooks until this stops 'passing'
  1305.                 return false;
  1306.         }
  1307.         catch (...)
  1308.         {
  1309.             return false;
  1310.         }
  1311.     }
  1312.     else if(TagDP.node().hasFn(MFn::kTransform))
  1313.     {
  1314.         try
  1315.         {
  1316.             MFnTransform transform(TagDP.node(), &stat);
  1317.             if(MAYA_FAILED(stat))//don't place hooks until this stops 'passing'
  1318.                 return false;
  1319.         }
  1320.         catch (...)
  1321.         {
  1322.             return false;
  1323.         }
  1324.     }
  1325.  
  1326.     return true;
  1327. }
  1328.  
  1329.  
  1330. bool DCCTag::SetInitialized(bool bInitializeNow)
  1331. {
  1332.     HRESULT hr= S_OK;
  1333.     MStatus stat= MS::kSuccess;
  1334.  
  1335.     if(IsInitialized())
  1336.     {
  1337.         if(bInitializeNow)
  1338.         {
  1339.             return true;
  1340.         }
  1341.         else
  1342.         {
  1343.             MMessage::removeCallback(PathCallback);
  1344.             PathCallback=0;
  1345.             Initialized= false;
  1346.             return false;
  1347.         }
  1348.     }
  1349.     else
  1350.     {
  1351.         if(!bInitializeNow)
  1352.         {
  1353.             return true;
  1354.         }
  1355.         else if( CanInitialize() )
  1356.         {
  1357.             Initialized= true;
  1358.  
  1359.             return true;
  1360.         }
  1361.     }
  1362.  
  1363.     return false;
  1364. }
  1365.  
  1366. DXCCTimeStamp::DXCCTimeStamp() 
  1367. {
  1368.     AcquireTime();
  1369.  
  1370. void 
  1371. DXCCTimeStamp::AcquireTime()
  1372. {
  1373.     _ftime(&Coarse);
  1374.     Fine= clock();
  1375. }
  1376.  
  1377. bool 
  1378. DXCCTimeStamp::RoughlyEqual(DXCCTimeStamp &test)
  1379. {
  1380.     if(this->Coarse.time == test.Coarse.time)
  1381.     {
  1382.         float micro= test.Coarse.millitm - this->Coarse.millitm;
  1383.         if(micro <= DX_UPDATE_FREQUENCY)
  1384.         {
  1385.             return true;
  1386.         }
  1387.     }
  1388.     return false;
  1389. }
  1390.  
  1391.  
  1392. void CMayaPreviewPipeline::UI_SetPreviewState(bool bPreview)
  1393. {
  1394.     MStatus stat= MS::kSuccess;
  1395.     if(bPreview == false && CallbackId_PreviewArray.length() > 0)//NOT PREVIEWING
  1396.     {
  1397.         MMessage::removeCallbacks(CallbackId_PreviewArray);     
  1398.         CallbackId_PreviewArray.clear();
  1399.     }
  1400.     else if(bPreview == true && CallbackId_PreviewArray.length() == 0)//PREVIEWING
  1401.     {
  1402.         CallbackId_PreviewArray.append(MSceneMessage::addCallback( MSceneMessage::Message::kBeforeOpen, CMayaPreviewPipeline::Callback_ScenePreload, NULL, &stat));
  1403.         CallbackId_PreviewArray.append(MSceneMessage::addCallback( MSceneMessage::Message::kSceneUpdate, CMayaPreviewPipeline::Callback_ScenePostload, NULL, &stat));
  1404.         CallbackId_PreviewArray.append(MSceneMessage::addCallback( MSceneMessage::Message::kMayaInitialized, CMayaPreviewPipeline::Callback_ScenePostload, NULL, &stat));
  1405.         
  1406.         CallbackId_PreviewArray.append(MSceneMessage::addCallback( MSceneMessage::Message::kBeforeSave, CMayaPreviewPipeline::Callback_SceneSave, NULL, &stat));
  1407.         
  1408.         CallbackId_PreviewArray.append(MEventMessage::addEventCallback("idle", CMayaPreviewPipeline::Callback_SceneIdle, NULL, &stat));
  1409.         
  1410.         CallbackId_PreviewArray.append(MDGMessage::addNodeAddedCallback( CMayaPreviewPipeline::Callback_NodeAdded, kDefaultNodeType, NULL, &stat)); 
  1411.         CallbackId_PreviewArray.append(MDGMessage::addNodeRemovedCallback( CMayaPreviewPipeline::Callback_NodeRemoved, kDefaultNodeType, NULL, &stat)); 
  1412.         //CallbackId_PreviewArray.append(MAnimMessage::addAnimCurveEditedCallback( CMayaPreviewPipeline::Callback_AnimationEdit, NULL, &stat)); 
  1413.     }
  1414. }
  1415.  
  1416. bool CMayaPreviewPipeline::UI_GetPreviewState()
  1417. {    
  1418.     int state= 0;
  1419.     MGlobal::executeCommand ("DirectX_GetPreviewState()",  state);
  1420.     //MGlobal::executeCommand ("menuItem -q -checkBox  $g_dxPreviewToggle;",  state);
  1421.  
  1422.     return (bool)(state==0?false:true);
  1423. }
  1424.  
  1425. bool CMayaPreviewPipeline::UI_GetSkinState()
  1426. {    
  1427.     int state= 0;
  1428.     MGlobal::executeCommand ("DirectX_GetSkinState()",  state);
  1429.     //MGlobal::executeCommand ("menuItem -q -checkBox  $g_dxSkinToggle;",  state);
  1430.  
  1431.     return (bool)(state==0?false:true);
  1432. }
  1433.  
  1434.  
  1435. HRESULT CMayaPreviewPipeline::Create()
  1436. {
  1437.     HRESULT hr= S_OK;
  1438.     MStatus stat= MS::kSuccess;
  1439.     MItDag FindRoot;
  1440.  
  1441.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1442.     
  1443.     hr= CPipeline::Create();
  1444.     if(DXCC_FAILED(hr))
  1445.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  1446.  
  1447.     //-----------------------INITIALIZATION ------------------------//
  1448.     FindRoot.getPath(MayaRoot);
  1449.  
  1450.     DxRoot.Interface= AccessRoot();
  1451.     DxRoot.Interface->AddRef();
  1452.  
  1453.     (*(LPD3DXMATRIX)(void*)AccessRoot()->GetLocalMatrix())(2,2)= -1.0f;
  1454.     (*(LPD3DXMATRIX)(void*)AccessRoot()->GetWorldMatrix())(2,2)= -1.0f;
  1455.  
  1456.  
  1457.     hr= AccessManager()->FindResourceByPointer(DxRoot.Interface, NULL, &DxRoot.Resource );
  1458.     if(DXCC_FAILED(hr))
  1459.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  1460.  
  1461.     DeviceCreatedEvent= CreateEventA(NULL, FALSE, FALSE, "DXCCPipeline_DeviceCreated");
  1462.     InitializeCriticalSection(&DeviceAndViewerSection);
  1463.  
  1464.  
  1465.  
  1466.     g_Engine.Create(this);
  1467.     SetEngine(&g_Engine);
  1468.  
  1469.     DXCC_ASSERT_EXCEPTIONS_END()
  1470.  
  1471. e_Exit:
  1472.     return hr;
  1473. }
  1474.  
  1475. void CMayaPreviewPipeline::Scene_Register()
  1476. {
  1477.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1478.  
  1479.     CPipelineLock SceneLock;
  1480.     SceneWriteLock(true, SceneLock);
  1481.  
  1482.     MStatus stat= MS::kSuccess;
  1483.  
  1484.     UI_SetPreviewState(UI_GetPreviewState());
  1485.  
  1486.     for(MItDependencyNodes iter; !iter.isDone(); iter.next())
  1487.     {
  1488.         Tag_Add( iter.item() );
  1489.     }
  1490.  
  1491.     Scene_Update(true);
  1492.  
  1493.     SceneWriteUnlock(SceneLock);
  1494.     DXCC_ASSERT_EXCEPTIONS_END()
  1495. }
  1496.  
  1497. HRESULT CMayaPreviewPipeline::Destroy()
  1498. {
  1499.     CPipelineLock SceneLock;
  1500.     SceneWriteLock(true, SceneLock);
  1501.  
  1502.     Scene_Deregister();
  1503.     
  1504.     CPipeline::Destroy();
  1505.  
  1506.     g_Engine.Destroy();
  1507.  
  1508.  
  1509.  
  1510.     MMessage::removeCallback( CallbackId_Exiting);
  1511.     CallbackId_Exiting=0;
  1512.     MMessage::removeCallback( CallbackId_AfterOpen);
  1513.     CallbackId_AfterOpen=0;
  1514.     MMessage::removeCallbacks(CallbackId_PreviewArray);
  1515.     MMessage::removeCallbacks(CallbackId_NodeArray);
  1516.  
  1517.  
  1518.     CloseHandle(DeviceCreatedEvent);
  1519.     DeviceCreatedEvent= NULL;
  1520.     DeleteCriticalSection(&DeviceAndViewerSection);
  1521.     //DeviceAndViewerSection= NULL;
  1522.  
  1523.     SceneWriteUnlock(SceneLock);
  1524.  
  1525.     return S_OK;
  1526. }
  1527.  
  1528. void CMayaPreviewPipeline::Scene_Deregister()
  1529. {
  1530.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1531.     LPDXCCFRAME pRoot= NULL;
  1532.     CPipelineLock SceneLock;
  1533.     SceneWriteLock(true, SceneLock);
  1534.  
  1535.     UI_SetPreviewState(false);
  1536.  
  1537.     pRoot= AccessRoot();
  1538.     pRoot->AddRef();
  1539.  
  1540.     while(pRoot->NumChildren() > 0)
  1541.     {
  1542.         pRoot->RemoveChild(0);
  1543.     }
  1544.  
  1545.     while(pRoot->NumMembers() > 0)
  1546.     {
  1547.         pRoot->RemoveMember(0);
  1548.     }
  1549.  
  1550.     DXCC_RELEASE(pRoot);
  1551.  
  1552.     TagContainer.EraseAll();
  1553.  
  1554.     MMessage::removeCallbacks(CallbackId_NodeArray);
  1555.  
  1556.     SceneWriteUnlock(SceneLock);
  1557.     DXCC_ASSERT_EXCEPTIONS_END()
  1558. }
  1559.  
  1560.  
  1561.  
  1562. HRESULT CMayaPreviewPipeline::Tag_Remove( MObject & node )
  1563. {
  1564.     HRESULT hr= S_OK;
  1565.     MStatus stat = MS::kSuccess;
  1566.  
  1567.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1568.  
  1569.     MObject oAttr;
  1570.     int cid;    
  1571.     MDagPathArray PathArray;
  1572.     MFnDependencyNode depNode(node);
  1573.  
  1574.     MPlug plugNameCallback= depNode.findPlug(DX_LONG_NAME_CALLBACKID);
  1575.     if(!plugNameCallback.isNull())
  1576.     {
  1577.         stat= plugNameCallback.getValue(cid);
  1578.         MMessage::removeCallback((MCallbackId)cid);
  1579.     }
  1580.  
  1581.     MPlug plugAttributeCallback= depNode.findPlug(DX_LONG_ATTRIB_CALLBACKID);
  1582.     if(!plugAttributeCallback.isNull())
  1583.     {
  1584.         stat= plugAttributeCallback.getValue(cid);
  1585.         MMessage::removeCallback((MCallbackId)cid);
  1586.     }
  1587.  
  1588.     //TagContainer.EraseInvalidTags();
  1589.  
  1590.     stat= MDagPath::getAllPathsTo(node, PathArray);
  1591.     for(UINT iPath= 0; iPath < PathArray.length(); iPath++)
  1592.     {
  1593.         UINT iRemove;
  1594.     
  1595.         MItDag itDag;
  1596.         for (itDag.reset(PathArray[iPath]); !itDag.isDone(); itDag.next())
  1597.         {
  1598.             UINT iRemove;
  1599.             MDagPath leaf;
  1600.             itDag.getPath(leaf);
  1601.  
  1602.             MFnDagNode leafDN(leaf);
  1603.             if(TagContainer.Find(leaf, &iRemove, NULL))
  1604.             {
  1605.                 DXCC_DPFA_REPORT("Erase NODE: %s", leaf.fullPathName().asChar());
  1606.                 if(!TagContainer.Erase(iRemove))
  1607.                     DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);    
  1608.             }
  1609.  
  1610.         }
  1611.     }
  1612.  
  1613.     DXCC_ASSERT_EXCEPTIONS_END()
  1614.  
  1615. e_Exit:
  1616.     return hr;
  1617. }
  1618.  
  1619.  
  1620. HRESULT CMayaPreviewPipeline::Tag_Add( MObject & node )
  1621. {
  1622.     HRESULT hr= S_OK;
  1623.     MStatus stat = MS::kSuccess;
  1624.     MFnNumericAttribute attr;
  1625.     MCallbackId cid;
  1626.     MPlug plugNameCallback;
  1627.     MPlug plugAttributeCallback;
  1628.     const char* typeStr= NULL;
  1629.     const char* nameStr= NULL;
  1630.  
  1631.  
  1632.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1633.  
  1634.     MFnDependencyNode depNode(node);
  1635.  
  1636.     if(node.hasFn(MFn::kManipulator3D)
  1637.     //|| node.hasFn(MFn::kGroundPlane)
  1638.     || node.hasFn(MFn::kCamera)
  1639.     )
  1640.         return hr;
  1641.  
  1642.  
  1643.     typeStr= node.apiTypeStr();
  1644.     nameStr= depNode.name().asChar();
  1645.  
  1646.     if(node.hasFn(MFn::kDagNode)
  1647.         //||
  1648.         //node.hasFn(MFn::kMesh)|| 
  1649.         //node.hasFn(MFn::kTransform)
  1650.         )
  1651.     {
  1652.         if(TagContainer.Add(node))
  1653.         {
  1654.             cid= MNodeMessage::addNameChangedCallback( node, CMayaPreviewPipeline::Callback_NodeNameChange, NULL, &stat);
  1655.             CallbackId_NodeArray.append(cid);
  1656.             plugNameCallback= depNode.findPlug(DX_LONG_NAME_CALLBACKID);
  1657.             if(plugNameCallback.isNull())
  1658.             {
  1659.                 MObject oAttr= attr.create(DX_LONG_NAME_CALLBACKID, DX_SHORT_NAME_CALLBACKID, MFnNumericData::Type::kInt, 0, &stat);
  1660.                 CHECK_MSTATUS( attr.setHidden( true ) );
  1661.                 CHECK_MSTATUS( attr.setStorable( false ) );
  1662.                 stat= depNode.addAttribute(oAttr, MFnDependencyNode::MAttrClass::kLocalDynamicAttr);
  1663.             }
  1664.             plugNameCallback.setValue((INT)cid);
  1665.  
  1666.  
  1667.             cid= MNodeMessage::addAttributeChangedCallback( node, CMayaPreviewPipeline::Callback_NodeAttributeChanged, NULL, &stat);
  1668.             CallbackId_NodeArray.append(cid);
  1669.             plugAttributeCallback= depNode.findPlug(DX_LONG_ATTRIB_CALLBACKID);
  1670.             if(plugAttributeCallback.isNull())
  1671.             {
  1672.                 MObject oAttr= attr.create(DX_LONG_ATTRIB_CALLBACKID, DX_SHORT_ATTRIB_CALLBACKID, MFnNumericData::Type::kInt, 0, &stat);
  1673.                 CHECK_MSTATUS( attr.setHidden( true ) );
  1674.                 CHECK_MSTATUS( attr.setStorable( false ) );
  1675.                 stat= depNode.addAttribute(oAttr, MFnDependencyNode::MAttrClass::kLocalDynamicAttr);
  1676.             }
  1677.             plugAttributeCallback.setValue((INT)cid);
  1678.         }
  1679.     }
  1680.  
  1681.  
  1682.     DXCC_ASSERT_EXCEPTIONS_END()
  1683.  
  1684. //e_Exit:
  1685.     return hr;
  1686. }
  1687.  
  1688. HRESULT CMayaPreviewPipeline::Tag_Rename( MObject & node)
  1689. {
  1690.     HRESULT hr= S_OK;
  1691.     MStatus stat = MS::kSuccess;
  1692.  
  1693.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1694.  
  1695.     MFnDependencyNode depNode(node);
  1696.  
  1697.     MDagPathArray PathArray;
  1698.     stat= MDagPath::getAllPathsTo(node, PathArray);
  1699.     for(UINT iPath= 0; iPath < PathArray.length(); iPath++)
  1700.     {
  1701.         DCCTag* tag= NULL;
  1702.         
  1703.         if(TagContainer.Find(PathArray[iPath], NULL, &tag)
  1704.             && tag->Resource != NULL)
  1705.         {
  1706.             DXCC_DPFA_REPORT("NAME: %s",  PathArray[iPath].fullPathName ().asChar());
  1707.             
  1708.             hr= tag->Resource->SetName(MakeNameExportable(tag->GetPath().partialPathName(&stat)).asChar());
  1709.             if(DXCC_FAILED(hr))
  1710.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  1711.         }
  1712.     }
  1713.  
  1714.     DXCC_ASSERT_EXCEPTIONS_END()
  1715.  
  1716. e_Exit:
  1717.     return hr;
  1718. }
  1719.  
  1720. HRESULT CMayaPreviewPipeline::Tag_Reparent( MDagMessage::DagMessage dagMsg, MDagPath &child, MDagPath &parent, bool bFixInstances)
  1721. {
  1722.     HRESULT hr= S_OK;
  1723.     MStatus stat = MS::kSuccess;
  1724.  
  1725.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1726.  
  1727.     MFnDependencyNode depNode(child.node());
  1728.  
  1729.     DCCTag* ChildTag=NULL;
  1730.     DCCTag* ParentTag=NULL;
  1731.     char* Msg= "";
  1732.  
  1733.     switch(dagMsg)
  1734.     {
  1735.     case MDagMessage::DagMessage::kParentAdded:
  1736.         Msg="ParentAdded";
  1737.         break;
  1738.     case MDagMessage::DagMessage::kChildAdded:
  1739.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);    
  1740.         //Msg="ChildAdded";
  1741.         //break;
  1742.     case MDagMessage::DagMessage::kParentRemoved:
  1743.         Msg="ParentRemoved";
  1744.         break;
  1745.     case MDagMessage::DagMessage::kChildRemoved:
  1746.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);    
  1747.         //Msg="ChildRemoved";
  1748.         //break;
  1749.     };
  1750.  
  1751.  
  1752.     if(bFixInstances)
  1753.     {
  1754.         if(dagMsg == MDagMessage::DagMessage::kParentAdded)
  1755.         {
  1756.             MItDag itDag;
  1757.             for (itDag.reset(child, MItDag::kBreadthFirst); !itDag.isDone() && (itDag.depth() <= 1) ; itDag.next())
  1758.             {
  1759.                 MDagPath leaf;
  1760.                 itDag.getPath(leaf);
  1761.                 
  1762.                 if(leaf.isInstanced())
  1763.                 {
  1764.                     TagContainer.Add(leaf, NULL, NULL);//will fail if already exists
  1765.                 }
  1766.             }
  1767.         }
  1768.         else if(dagMsg == MDagMessage::DagMessage::kParentRemoved)
  1769.         {
  1770.             MItDag itDag;
  1771.             for (itDag.reset(child); !itDag.isDone(); itDag.next())
  1772.             {
  1773.                 UINT iRemove;
  1774.                 MDagPath leaf;
  1775.                 itDag.getPath(leaf);
  1776.                 
  1777.                 if(TagContainer.Find(leaf, &iRemove, NULL))
  1778.                 {            
  1779.                     TagContainer.Erase(iRemove);
  1780.                 }
  1781.             }
  1782.         }
  1783.     }
  1784.  
  1785.     if(parent.hasFn(MFn::kWorld))//parent == DxRoot.GetPath())
  1786.         ParentTag= &DxRoot;
  1787.     else if(!TagContainer.Find(parent, NULL, &ParentTag))
  1788.     {
  1789.         const char* parenttype= parent.node().apiTypeStr();
  1790.         return S_OK;
  1791.     }
  1792.  
  1793.     if(child.hasFn(MFn::kWorld))//parent == DxRoot.GetPath())
  1794.         return S_OK;//ChildTag= &DxRoot;
  1795.     else if(!TagContainer.Find(child, NULL, &ChildTag))
  1796.     {
  1797.         const char* childtype= child.node().apiTypeStr();
  1798.         return S_OK;
  1799.     }
  1800.     else if(ChildTag == ParentTag)
  1801.     {
  1802.         const char* parenttype= parent.node().apiTypeStr();
  1803.         const char* childtype= child.node().apiTypeStr();
  1804.         ParentTag= &DxRoot;
  1805.     }
  1806.  
  1807.  
  1808.     if(    ChildTag
  1809.         && ParentTag
  1810.         &&ChildTag->Interface  
  1811.         && ParentTag->Interface)
  1812.     {
  1813.         DXCC_DPFA_REPORT("PARENTING: (%s) %s <==> %s", Msg, parent.fullPathName().asChar(), child.fullPathName().asChar());
  1814.  
  1815.         if( ParentTag->Resource->GetIID() == IID_IDXCCFrame 
  1816.             && ChildTag->Resource->GetIID() == IID_IDXCCFrame)
  1817.         {
  1818.             if(dagMsg == MDagMessage::DagMessage::kParentAdded)
  1819.             {
  1820.                 hr=((LPDXCCFRAME)ChildTag->Interface)->SetParent(((LPDXCCFRAME)ParentTag->Interface));
  1821.                 if(DXCC_FAILED(hr))
  1822.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  1823.  
  1824.                 TriggerViewerEvents.OnFrameChildAdded((LPDXCCFRAME)ParentTag->Interface, (LPDXCCFRAME)ChildTag->Interface);
  1825.  
  1826.             }
  1827.             else if(dagMsg == MDagMessage::DagMessage::kParentRemoved)
  1828.             {
  1829.                 hr=((LPDXCCFRAME)ChildTag->Interface)->SetParent(NULL);
  1830.                 if(DXCC_FAILED(hr))
  1831.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  1832.  
  1833.                 TriggerViewerEvents.OnFrameChildRemoved((LPDXCCFRAME)ParentTag->Interface, (LPDXCCFRAME)ChildTag->Interface);
  1834.             }
  1835.         }
  1836.         else if( ParentTag->Resource->GetIID() == IID_IDXCCFrame 
  1837.             && ChildTag->Resource->GetIID() == IID_IDXCCMesh)
  1838.         {
  1839.             if(dagMsg == MDagMessage::DagMessage::kParentAdded )
  1840.             {
  1841.                 hr=((LPDXCCFRAME)ParentTag->Interface)->AddMember((LPDXCCMESH)ChildTag->Interface);
  1842.                 if(DXCC_FAILED(hr))
  1843.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  1844.  
  1845.                 TriggerViewerEvents.OnFrameMemberAdded((LPDXCCFRAME)ParentTag->Interface, (LPDXCCMESH)ChildTag->Interface);
  1846.             }
  1847.             else if(dagMsg == MDagMessage::DagMessage::kParentRemoved )
  1848.             {
  1849.                 UINT iRemove;
  1850.                 if(DXCC_SUCCEEDED(((LPDXCCFRAME)ParentTag->Interface)->FindMemberByPointer(ChildTag->Interface, &iRemove)))
  1851.                 {
  1852.                     hr=((LPDXCCFRAME)ParentTag->Interface)->RemoveMember(iRemove);
  1853.                     if(DXCC_FAILED(hr))
  1854.                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  1855.                 
  1856.                     TriggerViewerEvents.OnFrameMemberRemoved((LPDXCCFRAME)ParentTag->Interface, (LPDXCCMESH)ChildTag->Interface);
  1857.                 }
  1858.             }
  1859.         }
  1860.     }
  1861.  
  1862.     DXCC_ASSERT_EXCEPTIONS_END()    
  1863. e_Exit:
  1864.     return hr;
  1865. }
  1866.  
  1867. void DPF_DEPNodeAttributeChanged(    MNodeMessage::AttributeMessage msg, 
  1868.                                     MPlug & plug,
  1869.                                     MPlug & otherPlug )
  1870. {
  1871.     DXCC_DPF_HEADER(TEXT("INFO"));
  1872.     DXCC_DPFA_SHORT("ATTRIBUTE: (");
  1873.     if(msg & MNodeMessage::AttributeMessage::kConnectionMade)
  1874.         DXCC_DPFA_SHORT("kConnectionMade|");
  1875.     if(msg & MNodeMessage::AttributeMessage::kConnectionBroken)
  1876.         DXCC_DPFA_SHORT("kConnectionBroken|");
  1877.     if(msg & MNodeMessage::AttributeMessage::kAttributeEval)
  1878.         DXCC_DPFA_SHORT("kAttributeEval|");
  1879.     if(msg & MNodeMessage::AttributeMessage::kAttributeSet)
  1880.         DXCC_DPFA_SHORT("kAttributeSet|");
  1881.     if(msg & MNodeMessage::AttributeMessage::kAttributeLocked)
  1882.         DXCC_DPFA_SHORT("kAttributeLocked|");
  1883.     if(msg & MNodeMessage::AttributeMessage::kAttributeUnlocked)
  1884.         DXCC_DPFA_SHORT("kAttributeUnlocked|");    
  1885.     if(msg & MNodeMessage::AttributeMessage::kAttributeAdded)
  1886.         DXCC_DPFA_SHORT("kAttributeAdded|");    
  1887.     if(msg & MNodeMessage::AttributeMessage::kAttributeRemoved)
  1888.         DXCC_DPFA_SHORT("kAttributeRemoved|");    
  1889.     if(msg & MNodeMessage::AttributeMessage::kAttributeRenamed)
  1890.         DXCC_DPFA_SHORT("kAttributeRenamed|");    
  1891.     if(msg & MNodeMessage::AttributeMessage::kAttributeKeyable)
  1892.         DXCC_DPFA_SHORT("kAttributeKeyable|");    
  1893.     if(msg & MNodeMessage::AttributeMessage::kAttributeUnkeyable)
  1894.         DXCC_DPFA_SHORT("kAttributeUnkeyable|");    
  1895.     if(msg & MNodeMessage::AttributeMessage::kIncomingDirection)
  1896.         DXCC_DPFA_SHORT("kIncomingDirection|");    
  1897.     if(msg & MNodeMessage::AttributeMessage::kAttributeArrayAdded)
  1898.         DXCC_DPFA_SHORT("kAttributeArrayAdded|");
  1899.     if(msg & MNodeMessage::AttributeMessage::kAttributeArrayRemoved)
  1900.         DXCC_DPFA_SHORT("kAttributeArrayRemoved|");
  1901.     if(msg & MNodeMessage::AttributeMessage::kOtherPlugSet)
  1902.         DXCC_DPFA_SHORT("kOtherPlugSet|");
  1903.     DXCC_DPFA_MESSAGE(") %s <==> %s", plug.name().asChar(), otherPlug.name().asChar());
  1904. };
  1905.  
  1906. HRESULT CMayaPreviewPipeline::Tag_Dirty(MNodeMessage::AttributeMessage msg, 
  1907.                                                             MPlug & plug,
  1908.                                                             MPlug & otherPlug)
  1909. {
  1910.     HRESULT hr= S_OK;
  1911.     MStatus stat = MS::kSuccess;
  1912.  
  1913.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  1914.  
  1915.     const char* attrName= MFnAttribute(plug.attribute()).name().asChar();
  1916.     //DPF_DEPNodeAttributeChanged(msg, plug, otherPlug );
  1917.  
  1918.     if(msg&MNodeMessage::AttributeMessage::kAttributeEval
  1919.     || msg&MNodeMessage::AttributeMessage::kAttributeSet
  1920.     || msg&MNodeMessage::AttributeMessage::kAttributeAdded
  1921.     || msg&MNodeMessage::AttributeMessage::kAttributeRemoved
  1922.     || msg&MNodeMessage::AttributeMessage::kAttributeRenamed
  1923.     || msg&MNodeMessage::AttributeMessage::kAttributeArrayAdded
  1924.     || msg&MNodeMessage::AttributeMessage::kAttributeArrayRemoved
  1925.     || msg&MNodeMessage::AttributeMessage::kOtherPlugSet
  1926.     || msg&MNodeMessage::AttributeMessage::kConnectionMade)
  1927.     {
  1928.         if((attrName == strstr(attrName, "visibility"))//visibility
  1929.         || (attrName == strstr(attrName, "lodVisibility"))//visibility
  1930.         || (attrName == strstr(attrName, "overrideVisibility"))//visibility
  1931.         || (attrName == strstr(attrName, "overrideEnabled"))//visibility
  1932.         || (attrName == strstr(attrName, "intermediateObject")))//visibility
  1933.         {
  1934.             MItDag itDag;
  1935.             MDagPathArray PathArray;
  1936.  
  1937.             stat= MDagPath::getAllPathsTo(plug.node(), PathArray);
  1938.             for(UINT iPath= 0; iPath < PathArray.length(); iPath++)
  1939.             {
  1940.                 for( itDag.reset(PathArray[iPath]); !itDag.isDone(); itDag.next())
  1941.                 {
  1942.                     DCCTag* tag= NULL;
  1943.                     MDagPath dagLeaf;
  1944.                     itDag.getPath(dagLeaf);
  1945.  
  1946.                     if(!DAGIsVisible(dagLeaf, &stat))
  1947.                     {                        
  1948.                         UINT iRemove;
  1949.                         if(TagContainer.Find(dagLeaf, &iRemove, &tag))
  1950.                         {
  1951.                             MDagPath dagParent= dagLeaf;
  1952.                             dagParent.pop();
  1953.                             Tag_Reparent(MDagMessage::DagMessage::kParentRemoved, dagLeaf, dagParent, false);
  1954.                             TagContainer.Erase(iRemove);
  1955.                         }
  1956.                     }
  1957.                     else
  1958.                     {
  1959.                         TagContainer.Add(dagLeaf, NULL, NULL);
  1960.                     }        
  1961.                 }
  1962.             }
  1963.         }
  1964.         else 
  1965.         //((0 == lstrcmpA(attrName, "outMesh"))//generic mesh update
  1966.         //|| (attrName == strstr(attrName, "pnts"))//vertex movement
  1967.         //|| (attrName == strstr(attrName, "instObjGroups"))//material assignment
  1968.         //|| (attrName == strstr(attrName, "translate"))//transform
  1969.         //|| (attrName == strstr(attrName, "rotate"))//transform
  1970.         //|| (attrName == strstr(attrName, "scale")))//transform
  1971.         {
  1972.             MDagPathArray PathArray;
  1973.  
  1974.             stat= MDagPath::getAllPathsTo(plug.node(), PathArray);
  1975.             for(UINT iPath= 0; iPath < PathArray.length(); iPath++)
  1976.             {
  1977.                 DCCTag* tag= NULL;
  1978.                 if(TagContainer.Find(PathArray[iPath], NULL, &tag))
  1979.                 {
  1980. #ifdef MAYA_ATTRIBUTE_DEBUG
  1981.                     tag->AttributeChanged.append(MFnAttribute(plug.attribute()).name());
  1982. #endif
  1983.                     TagContainer.MarkAsDirty(tag);
  1984.                 }
  1985.             }
  1986.         }
  1987.          
  1988.     }
  1989.  
  1990.     DXCC_ASSERT_EXCEPTIONS_END()
  1991.  
  1992. //e_Exit:
  1993.     return hr;
  1994. }
  1995.  
  1996. D3DXMATRIX& CMayaPreviewPipeline::PerspectiveCamera_GetView()
  1997. {
  1998.     return PerspectiveCamera_View;
  1999. }
  2000.  
  2001. D3DXMATRIX& CMayaPreviewPipeline::PerspectiveCamera_GetProjection()
  2002. {
  2003.     return PerspectiveCamera_Projection;
  2004. }
  2005.  
  2006. HRESULT CMayaPreviewPipeline::Synchronize_PerspectiveCamera()
  2007. {
  2008.     MDagPath MayaCamera;
  2009.     M3dView panel;
  2010.     for(UINT iView= 0; iView < M3dView::numberOf3dViews(); iView++)
  2011.     {
  2012.         D3DXMATRIXA16 mCamera;
  2013.         M3dView::get3dView(iView, panel);
  2014.         panel.getCamera(MayaCamera);
  2015.         MayaCamera.pop();
  2016.         //const char* cameraName= MayaCamera.partialPathName().asChar();
  2017.         if(MayaCamera.partialPathName() == MString("persp"))
  2018.         {
  2019.             MayaCamera.extendToShape();
  2020.             MFloatMatrix fView(MayaCamera.inclusiveMatrix().matrix );
  2021.  
  2022.             ConvertWorldMatrix(mCamera, fView);
  2023.  
  2024.             panel.getCamera(MayaCamera);
  2025.             MFnCamera fnMayaCamera(MayaCamera.node());
  2026.  
  2027.             MVector mUp= fnMayaCamera.upDirection();
  2028.             MVector mAt= fnMayaCamera.viewDirection();
  2029.             MPoint mEye= fnMayaCamera.eyePoint(MSpace::kWorld);
  2030.             
  2031.             D3DXVECTOR3 dxEye( (float)-mEye.x, (float)mEye.y, (float)mEye.z );
  2032.             D3DXVECTOR3 dxAt( (float)-mAt.x, (float)mAt.y, (float)mAt.z );
  2033.             D3DXVECTOR3 dxUp( (float)-mUp.x, (float)mUp.y, (float)mUp.z );
  2034.             D3DXVECTOR4 fEye;
  2035.             D3DXVECTOR4 fAt;
  2036.             D3DXVECTOR3 fUp;
  2037.  
  2038.             D3DXVec3Transform(&fEye, &dxEye,(D3DXMATRIX*)&mCamera);
  2039.             D3DXVec3Transform(&fAt, &dxAt,(D3DXMATRIX*)&mCamera);
  2040.             D3DXVec3TransformNormal(&fUp, &dxUp,(D3DXMATRIX*)&mCamera);
  2041.             
  2042.             
  2043.             D3DXMatrixLookAtLH(&PerspectiveCamera_View, 
  2044.                 (D3DXVECTOR3*)&fEye,
  2045.                 (D3DXVECTOR3*)&fAt,
  2046.                 &fUp);          
  2047.  
  2048.             // Projection matrix
  2049.             float zNear = fnMayaCamera.nearClippingPlane();
  2050.             float zFar = fnMayaCamera.farClippingPlane();
  2051.             float hFOV = fnMayaCamera.horizontalFieldOfView();
  2052.             float f = 1.0f / tan( hFOV / 2 );
  2053.  
  2054.             ZeroMemory( &PerspectiveCamera_Projection, sizeof(PerspectiveCamera_Projection) );
  2055.             PerspectiveCamera_Projection._11 = f;
  2056.             PerspectiveCamera_Projection._22 = f;
  2057.             PerspectiveCamera_Projection._33 = (zFar+zNear) / (zFar-zNear);
  2058.             PerspectiveCamera_Projection._34 = 1.0f;
  2059.             PerspectiveCamera_Projection._43 = -2 * (zFar*zNear)/(zFar-zNear);
  2060.             
  2061.             break;
  2062.         }
  2063.     }
  2064.     return S_OK;
  2065. }
  2066.  
  2067.  
  2068. HRESULT CMayaPreviewPipeline::Synchronize_Node(MObject & node)
  2069. {
  2070.     HRESULT hr= S_OK;
  2071.     MStatus stat= MS::kSuccess;
  2072.  
  2073.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2074.  
  2075.     MDagPathArray PathArray;
  2076.  
  2077.     stat= MDagPath::getAllPathsTo(node, PathArray);
  2078.     for(UINT iPath= 0; iPath < PathArray.length(); iPath++)
  2079.     {
  2080.         hr= Synchronize_DagPath(PathArray[iPath]);
  2081.         if(DXCC_FAILED(hr))
  2082.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2083.     }
  2084.     
  2085.     DXCC_ASSERT_EXCEPTIONS_END()
  2086.  
  2087. e_Exit:
  2088.     return hr;
  2089. }
  2090.  
  2091. HRESULT CMayaPreviewPipeline::Synchronize_DagPath(MDagPath &path)
  2092. {
  2093.     HRESULT hr= S_OK;
  2094.     MStatus stat= MS::kSuccess;
  2095.  
  2096.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2097.  
  2098.     if(path.node().hasFn(MFn::kMesh)
  2099.         || path.node().hasFn(MFn::kTransform))
  2100.     {
  2101.         DCCTag *tag= NULL;
  2102.         
  2103.         if(!TagContainer.Add(path, NULL, &tag))
  2104.             DXCC_STATUS_EXIT(hr, S_OK, e_Exit, FALSE);
  2105.  
  2106.  
  2107.         hr= Synchronize_Tag(tag);
  2108.         if(DXCC_FAILED(hr))
  2109.             DXCC_GOTO_EXIT(e_Exit, TRUE);    
  2110.     }
  2111.  
  2112.     DXCC_ASSERT_EXCEPTIONS_END()
  2113.  
  2114. e_Exit:
  2115.     return S_OK;
  2116. }
  2117.  
  2118. HRESULT CMayaPreviewPipeline::Synchronize_Tag(DCCTag *pTag)
  2119. {
  2120.     HRESULT hr= S_OK;
  2121.     MStatus stat= MS::kSuccess;
  2122.  
  2123.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2124.  
  2125. #ifdef MAYA_ATTRIBUTE_DEBUG
  2126.     DXCC_DPF_HEADER(TEXT("INFO"));
  2127.     DXCC_DPFA_MESSAGE("ATTRIBUTES: ");
  2128.     for(UINT i= 0; i < pTag->AttributeChanged.length(); i++)
  2129.     {
  2130.         DXCCDebugPrintfA(pTag->AttributeChanged[i].asChar());
  2131.         DXCCDebugPrintfA(" && ");
  2132.     }
  2133.     DXCC_DPFA_MESSAGE("");
  2134.     pTag->AttributeChanged.clear();
  2135. #endif
  2136.  
  2137.     if(pTag->GetPath().node().hasFn(MFn::kMesh))    
  2138.     {
  2139.         return Synchronize_Mesh(pTag);
  2140.     }
  2141.     else// if(pTag->Path.node().hasFn(MFn::kTransform))
  2142.     {
  2143.         return Synchronize_Frame(pTag);
  2144.     }
  2145.  
  2146.     DXCC_ASSERT_EXCEPTIONS_END()
  2147.  
  2148. //e_Exit:
  2149.     return S_OK;
  2150. }
  2151.  
  2152. HRESULT
  2153. CMayaPreviewPipeline::Synchronize_Frame(DCCTag *pTag)
  2154. {
  2155.     HRESULT hr= S_OK;
  2156.     MStatus stat= MS::kSuccess;
  2157.     D3DXMATRIX d3dMatrix;
  2158.  
  2159.     if(!pTag)
  2160.         return E_INVALIDARG;
  2161.  
  2162.  
  2163.  
  2164.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2165.  
  2166.     MDagPath dagTag= pTag->GetPath();
  2167.  
  2168.     //Create the frame???
  2169.     if(!pTag->IsInitialized())
  2170.     {
  2171.         hr= DXCCCreateFrame((LPDXCCFRAME*)&pTag->Interface);
  2172.         if(DXCC_FAILED(hr))
  2173.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2174.  
  2175.         hr= AccessManager()->RecycleResource(pTag->Resource->GetHandle(), pTag->Interface, IID_IDXCCFrame, TRUE, FALSE);
  2176.         if(DXCC_FAILED(hr))
  2177.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2178.  
  2179.         hr= pTag->Resource->SetName(MakeNameExportable(dagTag.partialPathName()).asChar());
  2180.         if(DXCC_FAILED(hr))
  2181.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2182.  
  2183.         TriggerManagerEvents.OnResourceRecycle(pTag->Resource);
  2184.     }
  2185.  
  2186.     if(pTag->Resource != NULL 
  2187.         && pTag->Resource->GetIID() != IID_IDXCCFrame)
  2188.     {
  2189.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2190.     }
  2191.  
  2192.     DXCC_DPFA("FRAME_SYNC: %s", dagTag.fullPathName().asChar());
  2193.  
  2194.     D3DXMatrixIdentity(&d3dMatrix);
  2195.     if(dagTag.node().hasFn(MFn::kTransform))
  2196.     {
  2197.         MMatrix localMatrix;
  2198.         MFnTransform fnTransform(dagTag.node(), &stat);
  2199.         if(MAYA_FAILED(stat))
  2200.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2201.  
  2202.         localMatrix= fnTransform.transformation(&stat).asMatrix();
  2203.         if(MAYA_FAILED(stat))
  2204.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2205.  
  2206.         ConvertLocalMatrix(d3dMatrix, localMatrix);
  2207.  
  2208.     }
  2209.  
  2210.     hr= ((LPDXCCFRAME)pTag->Interface)->SetLocalMatrix(&d3dMatrix);
  2211.     if(DXCC_FAILED(hr))
  2212.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2213.  
  2214.     DXCC_ASSERT_EXCEPTIONS_END()
  2215.  
  2216. e_Exit:
  2217.     return hr;
  2218. };
  2219.  
  2220. HRESULT CMayaPreviewPipeline::Mesh_GatherMeshInfo(MFnMesh& fnMesh, DCCMeshInfo& MayaMeshInfo)
  2221. {
  2222.     HRESULT hr= S_OK;
  2223.     MStatus stat = MS::kSuccess;
  2224.  
  2225.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2226.  
  2227.     //CALCULATE TRIANGLES AND VERTICES
  2228.     MItMeshPolygon itMeshPoly(MObject::kNullObj);
  2229.     MItMeshVertex itMeshVert(MObject::kNullObj);
  2230.  
  2231.     DXCC_ASSERT(!fnMesh.object().isNull());
  2232.  
  2233.     stat = itMeshPoly.reset(fnMesh.object());
  2234.     if(MAYA_FAILED(stat))
  2235.     {
  2236.         DXCC_DPF_ERROR(TEXT("Could not reset Poly iterator."));
  2237.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2238.     }
  2239.     for (; !itMeshPoly.isDone(); itMeshPoly.next())
  2240.     {
  2241.         int cPolyTriCount;
  2242.         UINT cPolyonVerticesMaya;
  2243.         
  2244.         cPolyonVerticesMaya= itMeshPoly.polygonVertexCount(&stat);
  2245.         if(MAYA_FAILED(stat))
  2246.         {
  2247.             DXCC_DPF_ERROR(TEXT("polygonVertexCount"));
  2248.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2249.         }
  2250.  
  2251.         stat= itMeshPoly.numTriangles(cPolyTriCount);
  2252.         if(MAYA_FAILED(stat))
  2253.         {
  2254.             DXCC_DPF_ERROR(TEXT("numTriangles"));
  2255.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2256.         }
  2257.  
  2258.         MayaMeshInfo.cD3DTriangles+= cPolyTriCount;
  2259.         MayaMeshInfo.cD3DVertices+= cPolyonVerticesMaya;
  2260.     }
  2261.     //END//CALCULATE TRIANGLES AND VERTICES
  2262.  
  2263.     hr= Mesh_GatherVertexInfo(fnMesh, MayaMeshInfo.VertexInfo);
  2264.     if(DXCC_FAILED(hr))
  2265.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2266.  
  2267.     DXCC_ASSERT_EXCEPTIONS_END()
  2268.  
  2269. e_Exit:
  2270.     return hr;
  2271. }
  2272.  
  2273. HRESULT CMayaPreviewPipeline::Mesh_GatherVertexInfo(MFnMesh& fnMesh, DCCVertexInfo& MayaVertexInfo)
  2274. {
  2275.     HRESULT hr= S_OK;
  2276.     MStatus stat = MS::kSuccess;
  2277.  
  2278.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2279.  
  2280.     //CALCULATE UV SET QUANTITY
  2281.     MayaVertexInfo.cUVs= fnMesh.numUVSets(&stat);
  2282.     if(MAYA_FAILED(stat))
  2283.     {
  2284.         DXCC_DPF_ERROR(TEXT("Unable to retrieve UV count."));
  2285.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2286.     }
  2287.  
  2288.     stat= fnMesh.getUVSetNames ( MayaVertexInfo.UVNames ); 
  2289.     if(MAYA_FAILED(stat))
  2290.     {
  2291.         DXCC_DPF_ERROR(TEXT("Unable to retrieve UV set names."));
  2292.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2293.     }
  2294.  
  2295.     stat= MayaVertexInfo.Ucoords.setLength(MayaVertexInfo.cUVs);
  2296.     if(MAYA_FAILED(stat))
  2297.     {
  2298.         DXCC_DPF_ERROR(TEXT("Unable to resize UV UCoord Array."));
  2299.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2300.     }
  2301.  
  2302.     stat= MayaVertexInfo.Vcoords.setLength(MayaVertexInfo.cUVs);
  2303.     if(MAYA_FAILED(stat))
  2304.     {
  2305.         DXCC_DPF_ERROR(TEXT("Unable to resize UV VCoord Array."));
  2306.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2307.     }
  2308.  
  2309.     DXCC_ASSERT_EXCEPTIONS_END()
  2310.  
  2311. e_Exit:
  2312.     return hr;
  2313.  
  2314. }
  2315.  
  2316. HRESULT    
  2317. CMayaPreviewPipeline::Mesh_CreateOrRecycle(DCCTag *pTag, MFnMesh &fnMesh, DCCMeshInfo &MayaMeshInfo)
  2318. {
  2319.     HRESULT hr= S_OK;
  2320.     MStatus stat = MS::kSuccess;
  2321.  
  2322.     LPDXCCDECLARATION    dxDeclaration= NULL; 
  2323.     LPDXCCMESH            dxMesh= NULL;    
  2324.     LPMESHUSERDATA        dxMeshUserData= NULL;
  2325.     LPDIRECT3DDEVICE9    dxDevice= NULL;
  2326.  
  2327.     if(!pTag)
  2328.         return E_INVALIDARG;
  2329.  
  2330.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2331.     
  2332.     MDagPath dagTag= pTag->GetPath();
  2333.  
  2334.     hr= pTag->Resource->GetUserData(NULL, (void**) &dxMeshUserData, NULL);
  2335.     if(DXCC_FAILED(hr))
  2336.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2337.  
  2338.     if( pTag->IsInitialized()
  2339.         && dxMeshUserData != NULL 
  2340.         && dxMeshUserData->cMayaPolygons == fnMesh.numPolygons()
  2341.         && dxMeshUserData->cMayaEdges == fnMesh.numEdges()
  2342.         && dxMeshUserData->cMayaFaceVertices == fnMesh.numFaceVertices()
  2343.         && dxMeshUserData->cMayaUVs == fnMesh.numUVs()
  2344.         && dxMeshUserData->cMayaUVSets == fnMesh.numUVSets()
  2345.         && dxMeshUserData->cMayaVertices == fnMesh.numVertices())
  2346.     {
  2347.         pTag->Interface->AddRef();
  2348.         dxMesh= (LPDXCCMESH)pTag->Interface;    
  2349.  
  2350.         dxMesh->RemoveAllAttributedMaterials();
  2351.  
  2352.         MayaMeshInfo.cD3DVertices=  dxMesh->NumVertices();
  2353.         MayaMeshInfo.cD3DTriangles=  dxMesh->NumFaces();
  2354.  
  2355.         DXCC_RELEASE(dxMesh);
  2356.  
  2357.         hr= Mesh_GatherVertexInfo(fnMesh, MayaMeshInfo.VertexInfo);
  2358.         if(DXCC_FAILED(hr))
  2359.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2360.  
  2361.         MeshCleanUserData(dxMeshUserData, fnMesh.numVertices(), MayaMeshInfo.cD3DVertices );
  2362.     }
  2363.     else
  2364.     {
  2365.         //must come before MeshCreateUserData to fill in MayaMeshInfo.cD3DVertices
  2366.         hr= Mesh_GatherMeshInfo(fnMesh, MayaMeshInfo);
  2367.         if(DXCC_FAILED(hr))
  2368.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2369.  
  2370.         //must come after Mesh_GatherMeshInfo to fill in MayaMeshInfo.cD3DVertices
  2371.         dxMeshUserData= MeshCreateUserData(pTag->Resource, fnMesh.numVertices(), MayaMeshInfo.cD3DVertices);
  2372.         if(!dxMeshUserData)
  2373.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2374.  
  2375.         dxMeshUserData->cMayaPolygons= fnMesh.numPolygons();
  2376.         dxMeshUserData->cMayaEdges= fnMesh.numEdges();
  2377.         dxMeshUserData->cMayaFaceVertices= fnMesh.numFaceVertices();
  2378.         dxMeshUserData->cMayaUVs= fnMesh.numUVs();
  2379.         dxMeshUserData->cMayaUVSets= fnMesh.numUVSets();
  2380.         dxMeshUserData->cMayaVertices= fnMesh.numVertices();
  2381.     
  2382.  
  2383.         hr= DXCCCreateDeclaration(&dxDeclaration);
  2384.         if(DXCC_FAILED(hr))
  2385.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2386.  
  2387.         hr= dxDeclaration->InsertPositionElement(dxDeclaration->NumElements());
  2388.         if(DXCC_FAILED(hr))
  2389.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2390.  
  2391.         hr= dxDeclaration->InsertNormalElement(dxDeclaration->NumElements());
  2392.         if(DXCC_FAILED(hr))
  2393.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2394.  
  2395.         hr= dxDeclaration->InsertDiffuseElement(dxDeclaration->NumElements());
  2396.         if(DXCC_FAILED(hr))
  2397.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2398.  
  2399.         for(UINT iTex= 0; iTex < MayaMeshInfo.VertexInfo.cUVs; iTex++)
  2400.         {
  2401.             hr=dxDeclaration->InsertTexcoordElement(dxDeclaration->NumElements(), iTex, 2, MayaMeshInfo.VertexInfo.UVNames[iTex].asChar() );
  2402.             if(DXCC_FAILED(hr))
  2403.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2404.         }
  2405.  
  2406.         hr= AccessEngine()->GetD3DDevice(&dxDevice);
  2407.         if(DXCC_FAILED(hr))
  2408.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  2409.  
  2410.         if(pTag->IsInitialized())
  2411.         {
  2412.             pTag->Interface->AddRef();
  2413.             dxMesh= (LPDXCCMESH)pTag->Interface;    
  2414.  
  2415.  
  2416.             hr= ((LPDXCCMESH)pTag->Interface)->Recycle(
  2417.                     MayaMeshInfo.cD3DTriangles,
  2418.                     MayaMeshInfo.cD3DVertices,
  2419.                     dxDevice,
  2420.                     dxDeclaration->GetElements());
  2421.             if(DXCC_FAILED(hr))
  2422.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2423.  
  2424.         }
  2425.         else
  2426.         {
  2427. //            DXCC_DPFA("MESH_INIT: %s", dagTag.fullPathName().asChar());
  2428.  
  2429.             hr= DXCCCreateMesh(MayaMeshInfo.cD3DTriangles, MayaMeshInfo.cD3DVertices, dxDevice, dxDeclaration->GetElements(), (LPDXCCMESH*)&pTag->Interface);
  2430.             if(DXCC_FAILED(hr))
  2431.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2432.  
  2433.             hr= AccessManager()->RecycleResource(pTag->Resource->GetHandle(), pTag->Interface, IID_IDXCCMesh, TRUE, FALSE );
  2434.             if(DXCC_FAILED(hr))
  2435.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2436.  
  2437.             hr= pTag->Resource->SetName(MakeNameExportable(dagTag.partialPathName()).asChar());
  2438.             if(DXCC_FAILED(hr))
  2439.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2440.  
  2441.             TriggerManagerEvents.OnResourceRecycle(pTag->Resource);
  2442.         }
  2443.     }
  2444.  
  2445.  
  2446.  
  2447.     DXCC_ASSERT_EXCEPTIONS_END()
  2448.  
  2449. e_Exit:
  2450.     DXCC_RELEASE(dxDevice);
  2451.     DXCC_RELEASE(dxDeclaration);
  2452.     DXCC_RELEASE(dxMesh);
  2453.  
  2454.     return hr;
  2455. }
  2456.  
  2457.  
  2458. HRESULT    
  2459. CMayaPreviewPipeline::Synchronize_Mesh(DCCTag *pTag)
  2460. {
  2461.     HRESULT hr= S_OK;
  2462.     MStatus stat = MS::kSuccess;
  2463.     
  2464.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  2465.  
  2466.     MFnSkinCluster SkinCluster;
  2467.     MFnMesh fnMesh;
  2468.  
  2469.     MItMeshPolygon itMeshPoly(MObject::kNullObj);
  2470.     MItMeshVertex itMeshVert(MObject::kNullObj);
  2471.     MObjectArray Shaders;
  2472.     MIntArray Attributes; 
  2473.     MDagPath dagTag= pTag->GetPath();
  2474.     MDagPath dagParent= dagTag;
  2475.     DCCTag *pTagParent= NULL;
  2476.     dagParent.pop();
  2477.  
  2478.  
  2479.     DCCMeshInfo MeshInfo;
  2480.     UINT iVertexD3D=0;
  2481.     UINT iTriangleD3D= 0;
  2482.     FLOAT fDeterminant=-1;
  2483.     DXCCFLOAT4 f4;
  2484.     LPDXCCVERTEXBUNDLER dxVertexBundler= NULL;
  2485.     LPDXCCMESH dxMesh= NULL;    
  2486.     LPMESHUSERDATA    dxMeshUserData= NULL;
  2487.  
  2488.     DXCC_DPFA("MESH_SYNC: %s", dagTag.fullPathName().asChar());
  2489.  
  2490.  
  2491.     if(TagContainer.Find(dagParent, NULL, &pTagParent)
  2492.         && pTagParent->Interface)
  2493.     {
  2494.         fDeterminant= D3DXMatrixDeterminant(((LPDXCCFRAME)pTagParent->Interface)->GetWorldMatrix());
  2495.     }
  2496.     
  2497.     stat = fnMesh.setObject(dagTag.node());
  2498.     if(MAYA_FAILED(stat))
  2499.     {
  2500.         DXCC_DPF_ERROR(TEXT("Object could not be read as mesh."));
  2501.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, FALSE);
  2502.     }
  2503.  
  2504.     hr= Mesh_CreateOrRecycle(pTag, fnMesh, MeshInfo);
  2505.     if(DXCC_FAILED(hr))
  2506.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2507.  
  2508.     hr= pTag->Resource->GetUserData(NULL, (void**) &dxMeshUserData, NULL);
  2509.     if(DXCC_FAILED(hr))
  2510.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2511.     pTag->Interface->AddRef();
  2512.     dxMesh= (LPDXCCMESH)pTag->Interface;
  2513.  
  2514.     //AND ATTRIBUTE BUFFER
  2515.  
  2516.     UINT instNum= dagTag.instanceNumber();
  2517.     stat= fnMesh.getConnectedShaders(dagTag.instanceNumber(), Shaders, Attributes);
  2518.     if(MAYA_FAILED(stat))
  2519.     {
  2520.         DXCC_DPF_ERROR(TEXT("Could not get Mesh Shaders"));
  2521.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2522.     }
  2523.     UINT NumShaders= Shaders.length();
  2524.     UINT NumAttributes= Attributes.length();
  2525.  
  2526.     hr= Mesh_GatherMaterials(Shaders, dxMesh);
  2527.     if(DXCC_FAILED(hr))
  2528.         DXCC_GOTO_EXIT( e_Exit, TRUE);
  2529.  
  2530.     if(UI_GetSkinState())
  2531.     {
  2532.         hr= Mesh_FindSkin(fnMesh, SkinCluster);
  2533.         if(DXCC_FAILED(hr))
  2534.             DXCC_GOTO_EXIT( e_Exit, TRUE);
  2535.     }
  2536.  
  2537.     hr= dxMesh->LockFaces();
  2538.     if(DXCC_FAILED(hr))
  2539.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2540.  
  2541.     hr= dxMesh->GetVertexBundler(&dxVertexBundler);
  2542.     if(DXCC_FAILED(hr))
  2543.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2544.  
  2545.     hr= dxVertexBundler->LockAll();
  2546.     if(DXCC_FAILED(hr))
  2547.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2548.         
  2549.     stat = itMeshPoly.reset(fnMesh.object());
  2550.     if(MAYA_FAILED(stat))
  2551.     {
  2552.         DXCC_DPF_ERROR(TEXT("Could not reset Poly iterator."));
  2553.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2554.     }
  2555.  
  2556.     stat = itMeshVert.reset(fnMesh.object());
  2557.     if(MAYA_FAILED(stat))
  2558.     {
  2559.         DXCC_DPF_ERROR(TEXT("Could not reset Poly Vertex iterator."));
  2560.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2561.     }
  2562.  
  2563.     //PolygonLoop
  2564.     iVertexD3D=0;
  2565.     iTriangleD3D=0;
  2566.     for (int iPolygonMaya = 0; 
  2567.         !itMeshPoly.isDone(); 
  2568.         iPolygonMaya++, itMeshPoly.next())
  2569.     {
  2570.         MVector            PolygonNormalMaya;
  2571.         D3DXVECTOR3        PolygonNormalD3D;
  2572.         int                cPolyonTrianglesMaya;
  2573.         UINT            cPolyonVerticesMaya= itMeshPoly.polygonVertexCount(&stat);
  2574.         if(MAYA_FAILED(stat))
  2575.         {
  2576.             DXCC_DPF_ERROR(TEXT("polygonVertexCount"));
  2577.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2578.         }
  2579.  
  2580.         stat= itMeshPoly.getNormal(PolygonNormalMaya, MSpace::kObject); 
  2581.         if(MAYA_FAILED(stat))
  2582.         {
  2583.             DXCC_DPF_ERROR(TEXT("Could not retrieve polygon(%d) normal."), iPolygonMaya);
  2584.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2585.         }
  2586.         f4.Encode(&PolygonNormalMaya.x, 3);
  2587.         f4.Decode(&PolygonNormalD3D);
  2588.  
  2589.         //PolygonVertexLoop
  2590.         for(UINT iPolygonVertexMaya= 0; 
  2591.             iPolygonVertexMaya < cPolyonVerticesMaya; 
  2592.             iPolygonVertexMaya++, iVertexD3D++)
  2593.             //,itPolyVert.next()
  2594.         {
  2595.             int unused;
  2596.             int iMeshVertexMaya= itMeshPoly.vertexIndex(iPolygonVertexMaya, &stat);
  2597.             if(MAYA_FAILED(stat))
  2598.             {
  2599.                 DXCC_DPF_ERROR(TEXT("Could not retrieve mesh vertex from polygon(%d) vertex(%d)."), iPolygonMaya, iPolygonVertexMaya);
  2600.                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2601.             }
  2602.  
  2603.             stat= itMeshVert.setIndex(iMeshVertexMaya, unused);
  2604.             if(MAYA_FAILED(stat))
  2605.             {
  2606.                 DXCC_DPF_ERROR(TEXT("Could not retrieve vertex(%d) iterator"), iMeshVertexMaya);
  2607.                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2608.             }
  2609.  
  2610.  
  2611.             MeshGlobal.VertexD3DToMaya[iVertexD3D].MayaPolygon= iPolygonMaya;
  2612.             MeshGlobal.VertexD3DToMaya[iVertexD3D].MayaVertex= iMeshVertexMaya;    
  2613.             if(MeshGlobal.VertexMayaToD3D[iMeshVertexMaya].D3DFirstPointRep == UNUSED32)
  2614.             {//link to D3DFirstPointRep&D3DLastPointRep if not hooked up
  2615.                 MeshGlobal.VertexMayaToD3D[iMeshVertexMaya].D3DFirstPointRep= iVertexD3D;
  2616.                 MeshGlobal.VertexMayaToD3D[iMeshVertexMaya].D3DLastPointRep= iVertexD3D;
  2617.  
  2618.                 MeshGlobal.D3DPointReps[iVertexD3D]=  iVertexD3D;
  2619.             }
  2620.             else
  2621.             {//link to D3DNextPointRep&D3DLastPointRep
  2622.                 DWORD iFirstPointRepD3D = MeshGlobal.VertexMayaToD3D[iMeshVertexMaya].D3DFirstPointRep;
  2623.                 DWORD iLastPointRepD3D = MeshGlobal.VertexMayaToD3D[iMeshVertexMaya].D3DLastPointRep;
  2624.                 MeshGlobal.VertexD3DToMaya[iLastPointRepD3D].D3DNextPointRep= iVertexD3D;    
  2625.                 MeshGlobal.VertexMayaToD3D[iMeshVertexMaya].D3DLastPointRep= iVertexD3D;
  2626.  
  2627.                 MeshGlobal.D3DPointReps[iVertexD3D]= iFirstPointRepD3D;
  2628.             }
  2629.  
  2630.  
  2631.             MeshInfo.VertexInfo.position= itMeshVert.position ( MSpace::kObject, &stat); 
  2632.             if(MAYA_FAILED(stat))
  2633.             {
  2634.                 DXCC_DPF_ERROR(TEXT("Could not retrieve polygon(%d) Vertex(%d)"), iPolygonMaya, iPolygonVertexMaya);
  2635.                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2636.             }
  2637.  
  2638.             hr= dxVertexBundler->SetPosition(iVertexD3D, f4.Encode(&MeshInfo.VertexInfo.position.x, 4));
  2639.             if(DXCC_FAILED(hr))
  2640.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2641.  
  2642.             stat= itMeshVert.getNormal(MeshInfo.VertexInfo.normal, iPolygonMaya, MSpace::kObject); 
  2643.             if(MAYA_FAILED(stat))
  2644.             {
  2645.                 MeshInfo.VertexInfo.normal= PolygonNormalMaya;
  2646.                 stat= MStatus::MStatusCode::kSuccess;
  2647.             }
  2648.  
  2649.             hr= dxVertexBundler->SetNormal(iVertexD3D, f4.Encode(&MeshInfo.VertexInfo.normal.x, 3));
  2650.             if(DXCC_FAILED(hr))
  2651.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2652.  
  2653.  
  2654.             for(UINT iUV= 0; iUV < MeshInfo.VertexInfo.UVNames.length(); iUV++)
  2655.             {
  2656.                 float2 uvPoint;
  2657.                 if(MAYA_SUCCEEDED(itMeshVert.getUV(iPolygonMaya, uvPoint,  &MeshInfo.VertexInfo.UVNames[iUV])))
  2658.                 {
  2659.                     MeshInfo.VertexInfo.Ucoords[iUV]= uvPoint[0];
  2660.                     MeshInfo.VertexInfo.Vcoords[iUV]= uvPoint[1];
  2661.                 }
  2662.                 else
  2663.                 {
  2664.                     MeshInfo.VertexInfo.Ucoords[iUV]= 0.0f;
  2665.                     MeshInfo.VertexInfo.Vcoords[iUV]= 0.0f;
  2666.                 }
  2667.  
  2668.                 hr= dxVertexBundler->SetTexcoord(iVertexD3D, iUV, f4.Encode(&D3DXVECTOR2(MeshInfo.VertexInfo.Ucoords[iUV], 1.0f-MeshInfo.VertexInfo.Vcoords[iUV])));
  2669.                 if(DXCC_FAILED(hr))
  2670.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  2671.             }
  2672.  
  2673.             if(itMeshVert.hasColor())
  2674.             {
  2675.                 if(!MAYA_FAILED(itMeshVert.getColor(MeshInfo.VertexInfo.color, iPolygonMaya)))
  2676.                 {
  2677.                     hr= dxVertexBundler->SetDiffuse(iVertexD3D, f4.Encode(&MeshInfo.VertexInfo.color.r, 4));
  2678.                     if(DXCC_FAILED(hr))
  2679.                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2680.                 }
  2681.             }
  2682.  
  2683.         }//END//PolygonVertexLoop
  2684.         
  2685.         stat= itMeshPoly.numTriangles(cPolyonTrianglesMaya);
  2686.         if(MAYA_FAILED(stat))
  2687.         {
  2688.             DXCC_DPF_ERROR(TEXT("Could not retrieve number of triangles."));
  2689.             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2690.         }
  2691.  
  2692.         //PolygonTriangleLoop
  2693.         for (int iPolyonTriangleMaya = 0; 
  2694.             iPolyonTriangleMaya < cPolyonTrianglesMaya; 
  2695.             iPolyonTriangleMaya++, iTriangleD3D++)
  2696.         {
  2697.             MPointArray            TrianglePointsMaya;
  2698.             MIntArray            TriangleVertexListMaya; //these are local to polygon
  2699.             D3DXPLANE            d3dxPlane;
  2700.             D3DXVECTOR3            v0,v1,v2;
  2701.             FLOAT                fDot;
  2702.             BOOL                bReverse= FALSE;
  2703.  
  2704.             stat= itMeshPoly.getTriangle(iPolyonTriangleMaya,  
  2705.                                          TrianglePointsMaya, //these are local to polygon
  2706.                                          TriangleVertexListMaya, 
  2707.                                          MSpace::Space::kObject );     
  2708.             if(MAYA_FAILED(stat))
  2709.             {
  2710.                 DXCC_DPF_ERROR(TEXT("Could not retrieve polygon(%d) triangle(%d)"), iPolygonMaya, iPolyonTriangleMaya);
  2711.                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2712.             }
  2713.  
  2714.             if(TriangleVertexListMaya.length() != 3)
  2715.             {
  2716.                 DXCC_DPF_ERROR(TEXT("Polygon(%d) Triangle(%d) Size != 3"), iPolygonMaya, iPolyonTriangleMaya);
  2717.                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  2718.             }
  2719.  
  2720.  
  2721.             (MFloatVector(TrianglePointsMaya[0])).get((FLOAT*)v0);
  2722.             (MFloatVector(TrianglePointsMaya[1])).get((FLOAT*)v1);
  2723.             (MFloatVector(TrianglePointsMaya[2])).get((FLOAT*)v2);
  2724.  
  2725.  
  2726.             D3DXPlaneFromPoints(          
  2727.                 &d3dxPlane,
  2728.                 &v0,
  2729.                 &v1,
  2730.                 &v2);
  2731.  
  2732.             D3DXPlaneNormalize(&d3dxPlane, &d3dxPlane);
  2733.  
  2734.             fDot= D3DXVec3Dot((D3DXVECTOR3*)&d3dxPlane, &PolygonNormalD3D);
  2735.  
  2736. //            if((fDot >= 0.0f && fDeterminant < 0.0f) || (fDot < 0.0f && fDeterminant >= 0.0f))
  2737.             if(fDot*fDeterminant < 0.0f) 
  2738.             {
  2739.                 int swap= TriangleVertexListMaya[1];
  2740.                 TriangleVertexListMaya[1]= TriangleVertexListMaya[2];
  2741.                 TriangleVertexListMaya[2]=swap;
  2742.             }
  2743.  
  2744.             DXCC_ASSERT( TriangleVertexListMaya.length() == 3 );
  2745.             //TriangleVertexLoop
  2746.             for(int iTriangleVertex= 0; 
  2747.                 iTriangleVertex < 3; 
  2748.                 iTriangleVertex++)
  2749.             {
  2750.                 int iMeshVertexMaya;
  2751.                 int iPolygonVertexD3D;
  2752.  
  2753.                 iMeshVertexMaya= TriangleVertexListMaya[iTriangleVertex];
  2754.                 iPolygonVertexD3D= MeshGlobal.VertexMayaToD3D[iMeshVertexMaya].D3DLastPointRep;//since we work per-polygon, the last pointrep is always the newest
  2755.  
  2756.                 hr= dxMesh->SetFaceVertex(iTriangleD3D, iTriangleVertex, iPolygonVertexD3D);
  2757.                 if(DXCC_FAILED(hr))
  2758.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  2759.             }
  2760.  
  2761.             int attrib= Attributes[iPolygonMaya];
  2762.             if(attrib < 0 || attrib >= NumShaders)
  2763.                 attrib= 0;
  2764.  
  2765.             hr= dxMesh->SetFaceAttribute(iTriangleD3D, attrib );
  2766.             if(DXCC_FAILED(hr))
  2767.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  2768.  
  2769.         }//END//PolygonTriangleLoop
  2770.     }//END//PolygonLoop
  2771.  
  2772.     hr= dxVertexBundler->UnlockAll();
  2773.     if(DXCC_FAILED(hr))
  2774.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2775.  
  2776.     hr= dxMesh->UnlockFaces();
  2777.     if(DXCC_FAILED(hr))
  2778.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2779.  
  2780.     hr= dxMesh->ConvertPointRepsToAdjacency(MeshGlobal.D3DPointReps.GetData());
  2781.     if(DXCC_FAILED(hr))
  2782.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2783.  
  2784.  
  2785.     hr= dxMesh->Optimize( D3DXCLEAN_SIMPLIFICATION, D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_COMPACT|D3DXMESHOPT_COMPACT, NULL, NULL);
  2786.     if(DXCC_FAILED(hr))
  2787.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  2788.  
  2789.  
  2790.  
  2791.     if(UI_GetSkinState())
  2792.     {
  2793.         hr= Mesh_GatherSkin(pTag, SkinCluster);
  2794.         if(DXCC_FAILED(hr))
  2795.             DXCC_GOTO_EXIT( e_Exit, TRUE);
  2796.     }
  2797.  
  2798.  
  2799.     TriggerViewerEvents.OnMeshChange(dxMesh);
  2800.  
  2801.  
  2802. e_Exit:
  2803.     DXCC_RELEASE(dxVertexBundler);
  2804.     DXCC_RELEASE(dxMesh);
  2805.  
  2806.  
  2807.     DXCC_ASSERT_EXCEPTIONS_END()
  2808.  
  2809.     return hr;
  2810. }
  2811.  
  2812. HRESULT    
  2813. CMayaPreviewPipeline::Mesh_GatherMaterials( 
  2814.     MObjectArray& Shaders,  //shadingEngine nodes
  2815.     LPDXCCMESH pMesh)
  2816. {
  2817.     HRESULT hr= S_OK;
  2818.     MStatus stat= MS::kSuccess;
  2819.  
  2820.     LPDXCCRESOURCE pRes= NULL;
  2821.     ID3DXEffect* pD3DMaterial= NULL;
  2822.  
  2823.     //SHADER
  2824.     if(Shaders.length() > 0)
  2825.     {
  2826.         for(UINT iShader= 0; iShader < Shaders.length(); iShader++) //shadingEngine nodes
  2827.         {
  2828.             MFnDependencyNode shadingEngine(Shaders[iShader]);
  2829.             MPlug ShaderPlug;
  2830.             MPlugArray ShaderPlugArray;
  2831.  
  2832.             DXCC_RELEASE(pRes);
  2833.             DXCC_RELEASE(pD3DMaterial);
  2834.  
  2835.             BOOL bFoundShader= false;
  2836.  
  2837.             //TODO displacement or volume shaders too!
  2838.             ShaderPlug = shadingEngine.findPlug("surfaceShader", &stat); 
  2839.             if (MAYA_SUCCEEDED(stat) && !ShaderPlug.isNull()) //we have to find the plug but it doesnt have to be connected
  2840.             {
  2841.                 ShaderPlug.connectedTo(ShaderPlugArray, true, false); //the t
  2842.     
  2843.                 if (ShaderPlugArray.length() == 1) 
  2844.                 {
  2845.                     MFnDependencyNode shader(ShaderPlugArray[0].node());
  2846.                     int iHandle;
  2847.                     DXCCHANDLE hHandle;
  2848.                     MPlug plugResource= shader.findPlug(DirectXShader::aDXCCHandle);
  2849.                     plugResource.getValue(iHandle);
  2850.                     hHandle= (DXCCHANDLE)iHandle;
  2851.  
  2852.                     if(hHandle != NULL)
  2853.                     {
  2854.                         if(DXCC_SUCCEEDED(AccessManager()->FindResourceByHandle(hHandle, &pRes)))
  2855.                         { 
  2856.                             //if(DXCC_SUCCEEDED(pRes->GetObject( (LPUNKNOWN*) &pD3DMaterial)))
  2857.                             if(DXCC_SUCCEEDED(pRes->QueryObject( IID_ID3DXEffect, (void**) &pD3DMaterial)))
  2858.                             {
  2859.                                 if(DXCC_SUCCEEDED(pMesh->SetAttributedMaterial(iShader, pD3DMaterial)))
  2860.                                 {
  2861.                                     bFoundShader= true;
  2862.                                 }
  2863.                                 DXCC_RELEASE(pD3DMaterial);
  2864.                             }
  2865.                             DXCC_RELEASE(pRes);
  2866.                         }
  2867.                     }
  2868.                 }
  2869.             }
  2870.  
  2871.             if(!bFoundShader)
  2872.             {
  2873.                 hr= pMesh->SetAttributedMaterial(iShader, NULL);
  2874.                 if(DXCC_FAILED(hr))
  2875.                     DXCC_GOTO_EXIT( e_Exit, TRUE);
  2876.             }
  2877.         }
  2878.  
  2879.         hr= pMesh->SetAttributedMaterial(Shaders.length(), NULL);
  2880.         if(DXCC_FAILED(hr))
  2881.             DXCC_GOTO_EXIT( e_Exit, TRUE);
  2882.     }
  2883.     else
  2884.     {
  2885.         hr= pMesh->SetAttributedMaterial(0, NULL);
  2886.         if(DXCC_FAILED(hr))
  2887.             DXCC_GOTO_EXIT( e_Exit, TRUE);
  2888.     }
  2889.  
  2890.  
  2891. e_Exit:
  2892.     DXCC_RELEASE(pRes);
  2893.     DXCC_RELEASE(pD3DMaterial);
  2894.  
  2895.     return hr;
  2896. }
  2897.  
  2898.  
  2899. HRESULT        
  2900. CMayaPreviewPipeline::Material_Save(MObject &node)
  2901. {
  2902.     HRESULT hr= S_OK;
  2903.     MStatus stat= MS::kSuccess;
  2904.     MFnDependencyNode depNode(node);
  2905.     const char *pEffectStr= NULL;
  2906.     MPlug plugResource= depNode.findPlug(DirectXShader::aDXCCHandle);
  2907.     LPDXCCRESOURCE pResource= NULL;
  2908.     LPD3DXEFFECT pEffect= NULL;
  2909.     MFnTypedAttribute tAttr;
  2910.     MFnNumericAttribute nAttr;
  2911.     MObject oFxParamList;
  2912.     DXCCHANDLE hHandle;
  2913.     int iHandle;
  2914.     CDXCCSaveEffectDefaults SaveParams;
  2915.     CPipelineLock SceneLock;
  2916.  
  2917.     SceneReadLock(true, SceneLock);
  2918.  
  2919.     plugResource.getValue(iHandle);
  2920.     hHandle= (DXCCHANDLE)iHandle;
  2921.  
  2922.     hr= AccessManager()->FindResourceByHandle(hHandle, &pResource);
  2923.     if(DXCC_FAILED(hr))
  2924.         DXCC_GOTO_EXIT(e_Exit, TRUE);        
  2925.  
  2926.     if(DXCC_FAILED(pResource->GetObject((LPUNKNOWN*)&pEffect)
  2927.         || (pEffect == NULL)))
  2928.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);        
  2929.  
  2930.     {//FILE PATH
  2931.         MPlug plugFilePath= depNode.findPlug(DX_LONG_FXFILE_PATH);
  2932.         if(plugFilePath.isNull())
  2933.         {
  2934.             MObject oFxFilePath= tAttr.create(DX_LONG_FXFILE_PATH, DX_SHORT_FXFILE_PATH, MFnData::Type::kString);
  2935.             CHECK_MSTATUS( tAttr.setHidden( true ) );
  2936.             stat= depNode.addAttribute(oFxFilePath, MFnDependencyNode::kLocalDynamicAttr );
  2937.             plugFilePath= depNode.findPlug(DX_LONG_FXFILE_PATH, &stat);
  2938.         }
  2939.     
  2940.         LPCSTR resourcepath= pResource->GetResourcePath();
  2941.         if(resourcepath)
  2942.         {
  2943.             CHECK_MSTATUS(plugFilePath.setValue(MString(resourcepath)));
  2944.         }
  2945.         else
  2946.         {
  2947.             CHECK_MSTATUS(plugFilePath.setValue(MString("")));
  2948.         }
  2949.  
  2950.     }//END//FILE PATH
  2951.  
  2952.     {//FILE NAME
  2953.         MPlug plugFileName= depNode.findPlug(DX_LONG_FXFILE_NAME);
  2954.         if(plugFileName.isNull())
  2955.         {
  2956.             MObject oFxFileName= tAttr.create(DX_LONG_FXFILE_NAME, DX_SHORT_FXFILE_NAME, MFnData::Type::kString);
  2957.             CHECK_MSTATUS( tAttr.setStorable( false ) );
  2958.             stat= depNode.addAttribute(oFxFileName, MFnDependencyNode::kLocalDynamicAttr );
  2959.             plugFileName= depNode.findPlug(DX_LONG_FXFILE_NAME, &stat);
  2960.         }
  2961.  
  2962.         LPCSTR resourcepath= strrchr(pResource->GetResourcePath(), '\\');
  2963.         if(resourcepath)
  2964.             resourcepath++;
  2965.         else
  2966.             resourcepath= pResource->GetResourcePath();
  2967.  
  2968.         CHECK_MSTATUS(plugFileName.setValue(MString(resourcepath)));
  2969.     }//END//FILE NAME
  2970.  
  2971.     {//PARAMTER COUNT
  2972.         MPlug plugParamCount= depNode.findPlug(DX_LONG_FXPARAM_COUNT);
  2973.         if(!plugParamCount.isNull())
  2974.         {
  2975.             int count;
  2976.             plugParamCount.getValue(count);
  2977.  
  2978.             for(int p= 0; p < count; p++)
  2979.             {
  2980.                 MObject oName= depNode.attribute(MString(DX_LONG_FXPARAM_NAME)+p, &stat);
  2981.                 MObject oData= depNode.attribute(MString(DX_LONG_FXPARAM_DATA)+p, &stat);
  2982.                 
  2983.                 if(!oName.isNull())
  2984.                     stat= depNode.removeAttribute(oName);
  2985.                 if(!oData.isNull())
  2986.                     stat= depNode.removeAttribute(oData);
  2987.             }
  2988.         }
  2989.         else
  2990.         {
  2991.             oFxParamList= nAttr.create(DX_LONG_FXPARAM_COUNT, DX_SHORT_FXPARAM_COUNT,MFnNumericData::Type::kInt, SaveParams.iParameter+1, &stat);
  2992.             CHECK_MSTATUS( nAttr.setHidden( true ) );
  2993.             CHECK_MSTATUS(depNode.addAttribute(oFxParamList, MFnDependencyNode::kLocalDynamicAttr));
  2994.         }
  2995.         plugParamCount= depNode.findPlug(DX_LONG_FXPARAM_COUNT);
  2996.  
  2997.         hr= SaveParams.Set(AccessManager(), node);
  2998.         if(DXCC_FAILED(hr))
  2999.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  3000.  
  3001.         hr= DXCCEnumEffectParameters(pEffect, &SaveParams, true, true);
  3002.         if(DXCC_FAILED(hr))
  3003.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  3004.  
  3005.         CHECK_MSTATUS(plugParamCount.setValue((int)(SaveParams.iParameter+1)));
  3006.     }//END//PARAMTER COUNT
  3007.     
  3008. e_Exit:
  3009.     DXCC_RELEASE(pResource);
  3010.     DXCC_RELEASE(pEffect);
  3011.     
  3012.     SceneReadUnlock(SceneLock);
  3013.  
  3014.     return hr;
  3015. }
  3016.  
  3017. HRESULT        
  3018. CMayaPreviewPipeline::Material_Restore(MObject &node)
  3019. {
  3020.     HRESULT hr= S_OK;
  3021.     MStatus stat= MS::kSuccess;
  3022.     
  3023.     MFnDependencyNode depNode(node);
  3024.  
  3025.     LPCSTR pFXFilePath= NULL;
  3026.     LPDIRECT3DDEVICE9 pd3dDevice= NULL;
  3027.     LPDXCCRESOURCE pResource= NULL;
  3028.     LPD3DXEFFECT pEffect= NULL;
  3029.  
  3030.     LPDXCCRESOURCE pResTexture= NULL;
  3031.     LPDIRECT3DCUBETEXTURE9 pTextureCube= NULL;
  3032.     LPDIRECT3DVOLUMETEXTURE9 pTexture3D= NULL;
  3033.     LPDIRECT3DTEXTURE9 pTexture2D= NULL;
  3034.     LPD3DXBUFFER pErrors= NULL;
  3035.     WIN32_FIND_DATAA FindFileData;
  3036.     HANDLE hFind;
  3037.     LPCSTR pFXFileFound= NULL;
  3038.  
  3039.     {//FILEPATH FILENAME
  3040.         MObject oFilePath;
  3041.         MPlug plugFilePath= depNode.findPlug(DX_LONG_FXFILE_PATH);
  3042.         if(MAYA_FAILED( plugFilePath.getValue(oFilePath)))
  3043.             return S_OK;
  3044.  
  3045.         MFnStringData sFilePathData(oFilePath);
  3046.         pFXFilePath= sFilePathData.string().asChar();
  3047.     }//END//FILEPATH
  3048.  
  3049.     MPlug plugParamCount= depNode.findPlug(DX_LONG_FXPARAM_COUNT);
  3050.  
  3051.     if(pFXFilePath && (pFXFilePath[0] != '\0') && !plugParamCount.isNull())
  3052.     {
  3053.         INT cParamCount;
  3054.         int iHandle= NULL;
  3055.         DXCCHANDLE hHandle= NULL;
  3056.         LPCSTR pFXFileName= NULL;
  3057.  
  3058.         {//FILENAME
  3059.             MPlug plugFileName= depNode.findPlug(DX_LONG_FXFILE_NAME);
  3060.     
  3061.             pFXFileName= strrchr(pFXFilePath, '\\');
  3062.             if(pFXFileName)
  3063.                 pFXFileName++;
  3064.             else
  3065.                 pFXFileName= pFXFilePath;
  3066.  
  3067.             plugFileName.setValue(MString(pFXFileName));
  3068.         }//END//FILENAME
  3069.  
  3070.         MPlug plugResource= depNode.findPlug(DirectXShader::aDXCCHandle);
  3071.         if(MAYA_SUCCEEDED(plugResource.getValue(iHandle)))
  3072.         {
  3073.             hHandle= (DXCCHANDLE)iHandle;
  3074.  
  3075.             if(!DXCC_SUCCEEDED(AccessManager()->FindResourceByHandle(hHandle, &pResource)))
  3076.             {
  3077.                 hr= AccessManager()->CreateResource(NULL, IID_ID3DXEffect, true, &pResource);
  3078.                 if(DXCC_FAILED(hr))
  3079.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  3080.             }
  3081.  
  3082.             AccessEngine()->GetD3DDevice(&pd3dDevice);
  3083.             if(DXCC_FAILED(hr))
  3084.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  3085.  
  3086.  
  3087.             hFind= FindFirstFileA(pFXFilePath, &FindFileData);
  3088.             if(INVALID_HANDLE_VALUE != hFind)
  3089.             {
  3090.                 FindClose(hFind);
  3091.                 pFXFileFound= pFXFilePath;
  3092.             }
  3093.             else 
  3094.             {
  3095.                 hFind= FindFirstFileA(pFXFileName, &FindFileData);
  3096.  
  3097.                 if(INVALID_HANDLE_VALUE != hFind)
  3098.                 {
  3099.                     FindClose(hFind);
  3100.                     pFXFileFound= pFXFileName;
  3101.                 }
  3102.                 else
  3103.                 {    
  3104.                     MString ErrorMsg= depNode.name() + MString(" cannot load shader - ") + MString(pFXFilePath);
  3105.                     MessageBoxA(NULL, "Shader FX file cannot be found!" , ErrorMsg.asChar(), MB_ICONEXCLAMATION);
  3106.                     DXCC_STATUS_EXIT(hr, S_OK, e_Exit, FALSE);
  3107.                 }
  3108.             }
  3109.  
  3110.             if(!DXCC_SUCCEEDED(D3DXCreateEffectFromFileA(
  3111.                     pd3dDevice,
  3112.                     pFXFileFound,
  3113.                     NULL,
  3114.                     NULL,
  3115.                     NULL,
  3116.                     NULL,
  3117.                     &pEffect,
  3118.                     &pErrors)))
  3119.             {
  3120.                 MessageBoxA(NULL,
  3121.                             (LPCSTR)pErrors->GetBufferPointer(),
  3122.                             "Effect Load Error",
  3123.                             MB_ICONEXCLAMATION);
  3124.                 DXCC_RELEASE(pErrors);
  3125.                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, FALSE);
  3126.             }
  3127.  
  3128.             hr= AccessManager()->RecycleResource(pResource->GetHandle(), pEffect, IID_ID3DXEffect, TRUE, FALSE); 
  3129.             if(DXCC_FAILED(hr))
  3130.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  3131.  
  3132.             hr= pResource->SetName(MakeNameExportable(depNode.name()).asChar());
  3133.             if(DXCC_FAILED(hr))
  3134.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  3135.  
  3136.             hr= pResource->SetResourcePath(pFXFilePath);
  3137.             if(DXCC_FAILED(hr))
  3138.                 DXCC_GOTO_EXIT(e_Exit, TRUE);
  3139.  
  3140.             
  3141.             CHECK_MSTATUS(plugParamCount.getValue(cParamCount));
  3142.  
  3143.             for(UINT i= 0; i < cParamCount; i++)
  3144.             {
  3145.                 MObject oData;
  3146.                 MObject oName;
  3147.                 MString szName;
  3148.                 
  3149.                 DXCC_RELEASE(pResTexture);
  3150.                 DXCC_RELEASE(pTexture2D);
  3151.                 DXCC_RELEASE(pTexture3D);
  3152.                 DXCC_RELEASE(pTextureCube);
  3153.  
  3154.                 MPlug plugName= depNode.findPlug(MString(DX_LONG_FXPARAM_NAME)+i, &stat);
  3155.                 if(!MAYA_SUCCEEDED( stat ))
  3156.                     continue;
  3157.                 MPlug plugData= depNode.findPlug(MString(DX_LONG_FXPARAM_DATA)+i, &stat);
  3158.                 if(!MAYA_SUCCEEDED( stat ))
  3159.                     continue;
  3160.  
  3161.                 stat= plugName.getValue(szName);
  3162.                 if(!MAYA_SUCCEEDED( stat ))
  3163.                     continue;
  3164.                 
  3165.                 stat= plugData.getValue(oData);
  3166.                 if(!MAYA_SUCCEEDED( stat ))
  3167.                     continue;
  3168.  
  3169.                 D3DXHANDLE hHandle= pEffect->GetParameterByName(NULL, szName.asChar());
  3170.                 if(hHandle != NULL)
  3171.                 {
  3172.                     D3DXPARAMETER_DESC ParamDesc;
  3173.                     if(DXCC_SUCCEEDED(pEffect->GetParameterDesc(hHandle, &ParamDesc )))
  3174.                     {
  3175.                         FLOAT fArray[16];
  3176.                         switch(ParamDesc.Class)
  3177.                         {
  3178.                         case D3DXPC_SCALAR:
  3179.                         case D3DXPC_VECTOR:
  3180.                         case D3DXPC_MATRIX_ROWS:
  3181.                         case D3DXPC_MATRIX_COLUMNS:
  3182.                             {
  3183.                                 MFnDoubleArrayData dArrayData(oData);
  3184.                                 MDoubleArray dArray= dArrayData.array();
  3185.  
  3186.                                 for(UINT i= 0; i < dArray.length(); i++)
  3187.                                     fArray[i]= (FLOAT)dArray[i];
  3188.  
  3189.                                 hr= pEffect->SetFloatArray(hHandle, fArray, dArray.length());
  3190.                                 if(DXCC_FAILED(hr))
  3191.                                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  3192.                             }
  3193.                             break;
  3194.                         case D3DXPC_OBJECT:
  3195.                             {
  3196.                                 switch(ParamDesc.Type)
  3197.                                 {
  3198.                                 case D3DXPT_STRING:
  3199.                                     {
  3200.                                         MFnStringData StringData(oData);
  3201.         
  3202.                                         hr= pEffect->SetString(hHandle, StringData.string().asChar());
  3203.                                         if(DXCC_FAILED(hr))
  3204.                                             DXCC_GOTO_EXIT(e_Exit, TRUE);
  3205.                                     }
  3206.                                     break;
  3207.                                 case D3DXPT_TEXTURE:
  3208.                                 case D3DXPT_TEXTURE1D:
  3209.                                 case D3DXPT_TEXTURE2D:
  3210.                                 case D3DXPT_TEXTURE3D:
  3211.                                 case D3DXPT_TEXTURECUBE:
  3212.                                     {
  3213.                                         D3DXIMAGE_INFO info;
  3214.                                         MFnStringData ParamStringData(oData);
  3215.                                         const char* pParamStr= ParamStringData.string().asChar();
  3216.  
  3217.                                         if(DXCC_SUCCEEDED(D3DXGetImageInfoFromFileA( pParamStr, &info)))
  3218.                                         {
  3219.                                             switch(info.ResourceType)
  3220.                                             {
  3221.                                             case D3DRTYPE_TEXTURE:
  3222.                                                 {
  3223.                                                     hr= D3DXCreateTextureFromFileA(         
  3224.                                                             pd3dDevice,
  3225.                                                             pParamStr,
  3226.                                                             &pTexture2D);
  3227.                                                     if(DXCC_FAILED(hr))
  3228.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3229.  
  3230.                                                     hr= AccessManager()->CreateResource(
  3231.                                                             pTexture2D, 
  3232.                                                             IID_IDirect3DTexture9, 
  3233.                                                             TRUE, 
  3234.                                                             &pResTexture);
  3235.                                                     if(DXCC_FAILED(hr))
  3236.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3237.  
  3238.                                                     hr= pResTexture->SetResourcePath(pParamStr);
  3239.                                                     if(DXCC_FAILED(hr))
  3240.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3241.  
  3242.                                                     hr= pEffect->SetTexture(hHandle, pTexture2D);
  3243.                                                     if(DXCC_FAILED(hr))
  3244.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3245.  
  3246.                                                 }
  3247.                                                 break;
  3248.                                             case D3DRTYPE_VOLUMETEXTURE:
  3249.                                                 {
  3250.                                                     hr= D3DXCreateVolumeTextureFromFileA(         
  3251.                                                             pd3dDevice,
  3252.                                                             pParamStr,
  3253.                                                             &pTexture3D);
  3254.                                                     if(DXCC_FAILED(hr))
  3255.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3256.  
  3257.                                                     hr= AccessManager()->CreateResource(
  3258.                                                             pTexture3D, 
  3259.                                                             IID_IDirect3DVolumeTexture9, 
  3260.                                                             TRUE, 
  3261.                                                             &pResTexture);
  3262.                                                     if(DXCC_FAILED(hr))
  3263.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3264.  
  3265.                                                     hr= pResTexture->SetResourcePath(pParamStr);
  3266.                                                     if(DXCC_FAILED(hr))
  3267.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3268.  
  3269.                                                     hr= pEffect->SetTexture(hHandle, pTexture3D);
  3270.                                                     if(DXCC_FAILED(hr))
  3271.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3272.                                                 }
  3273.                                                 break;
  3274.                                             case D3DRTYPE_CUBETEXTURE:
  3275.                                                 {
  3276.                                                     hr= D3DXCreateCubeTextureFromFileA(         
  3277.                                                             pd3dDevice,
  3278.                                                             pParamStr,
  3279.                                                             &pTextureCube);
  3280.                                                     if(DXCC_FAILED(hr))
  3281.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3282.  
  3283.                                                     hr= AccessManager()->CreateResource(
  3284.                                                             pTextureCube, 
  3285.                                                             IID_IDirect3DCubeTexture9, 
  3286.                                                             TRUE, 
  3287.                                                             &pResTexture);
  3288.                                                     if(DXCC_FAILED(hr))
  3289.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3290.  
  3291.                                                     hr= pResTexture->SetResourcePath(pParamStr);
  3292.                                                     if(DXCC_FAILED(hr))
  3293.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3294.  
  3295.                                                     hr= pEffect->SetTexture(hHandle, pTextureCube);
  3296.                                                     if(DXCC_FAILED(hr))
  3297.                                                         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3298.                                                 }
  3299.                                                 break;
  3300.                                             };//end switch info.ResourceType
  3301.                                         }//end D3DXGetImageInfoFromFile
  3302.                                     }//end case textures
  3303.                                     break;
  3304.                                 };//end switch object type
  3305.                             }//end case object
  3306.                             break;
  3307.                         case D3DXPC_STRUCT:
  3308.                         default:
  3309.                             DXCC_ASSERT(FALSE);
  3310.                             break;
  3311.                         }; //end switch ParamDesc.Class
  3312.                     }//end GetParameterDesc
  3313.                 }//end hHandle
  3314.             }//end MFnCompoundAttribute child loop
  3315.  
  3316.  
  3317.             Synchronize_Material(hHandle);
  3318.  
  3319.         }//end FindResource
  3320.     }//end aPath is !null
  3321.  
  3322. e_Exit:
  3323.  
  3324.     DXCC_RELEASE(pResTexture);
  3325.     DXCC_RELEASE(pTexture2D);
  3326.     DXCC_RELEASE(pTexture3D);
  3327.     DXCC_RELEASE(pTextureCube);
  3328.  
  3329.     DXCC_RELEASE(pd3dDevice);
  3330.     DXCC_RELEASE(pResource);
  3331.     DXCC_RELEASE(pEffect);
  3332.     DXCC_RELEASE(pErrors);
  3333.  
  3334.     return hr;
  3335. }
  3336.  
  3337.  
  3338. void    
  3339. MeshCleanUserData(
  3340.     LPMESHUSERDATA dxMeshUserData, 
  3341.     UINT cVerticesMaya,
  3342.     UINT cVerticesD3D)    
  3343.  
  3344.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  3345.  
  3346.     if(new(dxMeshUserData) MeshUserData)
  3347.     {
  3348.         if(cVerticesD3D > MeshGlobal.D3DPointReps.GetCount())
  3349.         {
  3350.             MeshGlobal.D3DPointReps.SetCount(cVerticesD3D);
  3351.             MeshGlobal.VertexD3DToMaya.SetCount(cVerticesD3D);
  3352.         }
  3353.         ///////////NOT NEEDED/////////MAIN FUNCTION CAN DO THIS/////////
  3354.         //we fill unused elements in d3dx with all 'f's
  3355.         //FillMemory((DWORD*)MeshGlobal.D3DPointReps.GetData(), cVerticesD3D*sizeof(DWORD), 0xff);//fill minimum needed
  3356.  
  3357.         ///////////NOT NEEDED/////////MAIN FUNCTION CAN DO THIS/////////
  3358.         //new((VertexD3DToMayaType*)MeshGlobal.VertexD3DToMaya.GetData()) VertexD3DToMayaType[cVerticesD3D];//fill minimum needed
  3359.  
  3360.         if(cVerticesMaya > MeshGlobal.VertexMayaToD3D.GetCount())
  3361.         {
  3362.             MeshGlobal.VertexMayaToD3D.SetCount(cVerticesMaya);
  3363.         }
  3364.  
  3365.         new((VertexD3DToMayaType*)MeshGlobal.VertexMayaToD3D.GetData()) VertexMayaToD3DType[cVerticesMaya];
  3366.  
  3367.     }
  3368.  
  3369.  
  3370.     DXCC_ASSERT_EXCEPTIONS_END()
  3371.  
  3372.     return;
  3373. }
  3374.  
  3375. LPMESHUSERDATA    
  3376. MeshCreateUserData(
  3377.     LPDXCCRESOURCE pRes, 
  3378.     UINT cVerticesMaya,
  3379.     UINT cVerticesD3D)    
  3380.     //HRESULT hr;
  3381.     LPMESHUSERDATA dxMeshUserData= NULL;
  3382.  
  3383.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  3384.  
  3385.     DWORD size= sizeof(MeshUserData);
  3386.         //+sizeof(DWORD)*cVerticesD3D
  3387.         //+sizeof(MeshUserData::VertexD3DToMayaType)*cVerticesD3D
  3388.         //+sizeof(MeshUserData::VertexMayaToD3DType)*cVerticesMaya;
  3389.         
  3390.     if(DXCC_SUCCEEDED(pRes->CreateUserData(size))
  3391.         && DXCC_SUCCEEDED(pRes->GetUserData(NULL, (void**) &dxMeshUserData, NULL)))
  3392.     {
  3393.         MeshCleanUserData(dxMeshUserData, cVerticesMaya, cVerticesD3D);
  3394.     }
  3395.  
  3396.     DXCC_ASSERT_EXCEPTIONS_END()
  3397.  
  3398.     return dxMeshUserData;
  3399. }
  3400.  
  3401.  
  3402. LPMESHUSERDATA    
  3403. MeshGetUserData(LPDXCCMESH pMesh, LPDXCCMANAGER pDXCCManager)                        
  3404.     LPDXCCRESOURCE pRes= NULL;
  3405.     LPMESHUSERDATA dxMeshUserData= NULL;
  3406.  
  3407.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  3408.  
  3409.     if(DXCC_SUCCEEDED(pDXCCManager->FindResourceByPointer(pMesh, NULL, &pRes)))
  3410.         pRes->GetUserData(NULL, (void**) &dxMeshUserData, NULL);
  3411.  
  3412.     DXCC_ASSERT_EXCEPTIONS_END()
  3413.  
  3414.     DXCC_RELEASE(pRes);
  3415.     return dxMeshUserData;  
  3416. }
  3417.  
  3418. void DCCTagContainer::MarkAsDirty(DCCTag* tag)
  3419. {
  3420.     if(!tag->Dirty)
  3421.     {
  3422.         tag->Dirty= true;
  3423.         DirtyArray.push_back(tag);
  3424.     }
  3425. }
  3426.  
  3427.  
  3428. void DCCTagContainer::MarkAsClean_SLOW(DCCTag* tag)
  3429. {
  3430.     if(tag->Dirty)
  3431.     {
  3432.         for(UINT i= 0; i < SizeFromDirtyList(); i++)
  3433.         {
  3434.             DCCTag* found= NULL;
  3435.             if(    GetFromDirtyList(i, found)&& 
  3436.                 found == tag)
  3437.             {
  3438.                 MarkAsClean(i);
  3439.                 return;
  3440.             }
  3441.         }
  3442.     }
  3443. }
  3444.  
  3445.  
  3446. void DCCTagContainer::MarkAsDirty(UINT iGlobalTagIndex)
  3447. {
  3448.     DCCTag* tag= NULL;
  3449.     if(Get(iGlobalTagIndex, tag))
  3450.     {
  3451.         MarkAsDirty(tag);
  3452.     }
  3453. }
  3454.  
  3455. void DCCTagContainer::MarkAsClean(UINT iDirtyListIndex)
  3456. {
  3457.     DCCTag* tag= NULL;
  3458.     
  3459.     if(GetFromDirtyList(iDirtyListIndex, tag))
  3460.     {
  3461.         if(tag->Dirty)
  3462.         {
  3463.             tag->Dirty=false;
  3464.             DirtyArray.erase(DirtyArray.begin()+iDirtyListIndex);
  3465.         }
  3466.     }
  3467. }
  3468.  
  3469.  
  3470. bool DCCTagContainer::IsDirty(DCCTag* tag)
  3471. {
  3472.     return tag->Dirty;
  3473. }
  3474.  
  3475. HRESULT    CMayaPreviewPipeline::Mesh_FindSkin(MFnMesh& InOutMesh, MFnSkinCluster& SkinCluster)
  3476. {
  3477.     HRESULT hr = S_OK;
  3478.     MStatus stat = MS::kSuccess;
  3479.  
  3480.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  3481.  
  3482.     MItDependencyGraph FindSkin(    InOutMesh.object(), 
  3483.                                     MFn::kSkinClusterFilter, 
  3484.                                     MItDependencyGraph::Direction::kUpstream,
  3485.                                     MItDependencyGraph::Traversal::kBreadthFirst,
  3486.                                     MItDependencyGraph::Level::kNodeLevel, 
  3487.                                     &stat);
  3488.     if(MAYA_SUCCEEDED(stat))
  3489.     {
  3490.         MItDependencyGraph FindMesh(    FindSkin.thisNode(), 
  3491.                                         MFn::kMesh, 
  3492.                                         MItDependencyGraph::Direction::kUpstream,
  3493.                                         MItDependencyGraph::Traversal::kBreadthFirst,
  3494.                                         MItDependencyGraph::Level::kNodeLevel, 
  3495.                                         &stat);
  3496.         if(MAYA_FAILED(stat))
  3497.             DXCC_STATUS_EXIT(hr, S_OK, e_Exit, TRUE);
  3498.         //Exit if we couldnt find the original Mesh
  3499.  
  3500.         SkinCluster.setObject(FindSkin.thisNode());
  3501.         
  3502.         InOutMesh.setObject(FindMesh.thisNode());
  3503.     }
  3504.  
  3505.     DXCC_ASSERT_EXCEPTIONS_END()
  3506.  
  3507. e_Exit:
  3508.     return hr;
  3509. }
  3510.  
  3511. HRESULT    CMayaPreviewPipeline::Mesh_GatherSkin(DCCTag *pTag, MFnSkinCluster& SkinCluster)
  3512. {
  3513.     HRESULT hr = S_OK;
  3514.     MStatus stat = MS::kSuccess;
  3515.     LPDXCCMESH dxMesh= NULL;
  3516.     DCCTag *pParentTag= NULL;
  3517.     LPMESHUSERDATA    dxMeshUserData= NULL;
  3518.     MMatrix            MatrixToMesh;                        
  3519.  
  3520.     DXCC_ASSERT_EXCEPTIONS_BEGIN()
  3521.  
  3522.     if(SkinCluster.object().isNull())
  3523.         return hr;
  3524.  
  3525.     MDagPath dagParent= pTag->GetPath();
  3526.     dagParent.pop();
  3527.  
  3528.     if(!TagContainer.Find(dagParent, NULL, &pParentTag))
  3529.         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3530.  
  3531.     MatrixToMesh= dagParent.exclusiveMatrix();
  3532.  
  3533.     hr= pTag->Resource->GetUserData(NULL, (void**) &dxMeshUserData, NULL);
  3534.     if(DXCC_SUCCEEDED(hr))
  3535.     {
  3536.         pTag->Interface->AddRef();
  3537.         dxMesh= (LPDXCCMESH)pTag->Interface;
  3538.  
  3539.         if(MAYA_SUCCEEDED(stat))
  3540.         {
  3541.             MDagPathArray bones;
  3542.             UINT cBones;
  3543.  
  3544.             cBones= SkinCluster.influenceObjects(bones, &stat);
  3545.             if(cBones > 0)
  3546.             {
  3547.                 hr= dxMesh->CreateBones(cBones);
  3548.                 if(DXCC_FAILED(hr))
  3549.                     DXCC_GOTO_EXIT(e_Exit, TRUE);
  3550.  
  3551.                 for(UINT iBone= 0; iBone < cBones; iBone++)
  3552.                 {
  3553.                     MSelectionList    SelectionInfo;
  3554.                     MFloatArray        Weights;
  3555.                     MFnTransform    fnBone;
  3556.                     DCCTag*            pBoneTag= NULL;
  3557.  
  3558.                     //MObject            VertexSets;
  3559.                     //UINT            iWeight;
  3560.                     MPlug            PlugToBindPose;
  3561.                     MObject            MObjectToBindPose;
  3562.                     //MMatrix            WorldWorldBindMatrix;
  3563.  
  3564.  
  3565.                     DXCC_DPFA("Processing SkinCluster Bone: %s", bones[iBone].partialPathName().asChar());
  3566.  
  3567.                     //Get d3d bone
  3568.                     if(!TagContainer.Find(bones[iBone], NULL, &pBoneTag))
  3569.                     {
  3570.                         DXCC_DPF_ERROR(TEXT("Could not find bone"));
  3571.                         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3572.                     }
  3573.  
  3574.                     //Get maya bone
  3575.                     stat = fnBone.setObject(bones[iBone]);
  3576.                     if(MAYA_FAILED(stat))
  3577.                     {
  3578.                         DXCC_DPF_ERROR(TEXT("Could not create transform"));
  3579.                         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3580.                     }
  3581.  
  3582.                     //get influences
  3583.                     stat = SkinCluster.getPointsAffectedByInfluence(bones[iBone], SelectionInfo, Weights);
  3584.                     if(MAYA_FAILED(stat))
  3585.                     {
  3586.                         DXCC_DPF(TEXT("Ignoring bone because failure on getPointsAffectedByInfluence."));
  3587.                         DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3588.                     }
  3589.  
  3590.                     {//BIND POSE
  3591.  
  3592.                         MMatrix            MatrixToBindPose;
  3593.                         MMatrix            MatrixOfBoneOffset;
  3594.                         MFnMatrixData    MatrixDataToBindPose;
  3595.                         D3DXMATRIX        matBoneOffset;
  3596.  
  3597.                         MObjectToBindPose = MObject::kNullObj;
  3598.  
  3599.                         PlugToBindPose = fnBone.findPlug("bindPose", &stat);
  3600.                         if(MAYA_FAILED(stat)) // success
  3601.                         {
  3602.                             DXCC_DPF_ERROR(TEXT("Could not get Pose Plug"));
  3603.                             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3604.                         }
  3605.  
  3606.                         stat = PlugToBindPose.getValue(MObjectToBindPose);
  3607.                         if(MAYA_FAILED(stat))
  3608.                         {
  3609.                             DXCC_DPF_ERROR(TEXT("Could not get Pose Plug WorldWorldBindMatrix MObject"));
  3610.                             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3611.                         }
  3612.  
  3613.                         stat = MatrixDataToBindPose.setObject(MObjectToBindPose);
  3614.                         if(MAYA_FAILED(stat))
  3615.                         {
  3616.                             DXCC_DPF_ERROR(TEXT("Could not get WorldWorldBindMatrix FnMatrixData interface"));
  3617.                             DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3618.                         }
  3619.  
  3620.                         MatrixToBindPose= MatrixDataToBindPose.matrix();
  3621.  
  3622.                         MatrixOfBoneOffset= MatrixToMesh * MatrixToBindPose.inverse();
  3623.  
  3624.                         ConvertLocalMatrix(matBoneOffset, MatrixOfBoneOffset);
  3625.                     
  3626.                         dxMesh->SetBoneFrame(iBone, (LPDXCCFRAME)pBoneTag->Interface, NULL);
  3627.                         dxMesh->SetBoneOffsetMatrix(iBone, &matBoneOffset);
  3628.                     }//END//BIND POSE
  3629.  
  3630.  
  3631.                     //WEIGHTS
  3632.                     if(SelectionInfo.length() == 0)
  3633.                     {
  3634.                         for (UINT iWeight = 0; iWeight < dxMesh->NumVertices(); iWeight++)
  3635.                         {
  3636.                             dxMesh->SetBoneInfluence(iBone, iWeight, 0.0f);
  3637.                         };
  3638.                     }
  3639.                     else
  3640.                     {
  3641.                         for(UINT iInfluenceComponents= 0; iInfluenceComponents < SelectionInfo.length(); iInfluenceComponents++)
  3642.                         {
  3643.                             MDagPath dagMesh;
  3644.                             MObject components;
  3645.  
  3646.                             //get mesh and vertices from selection data
  3647.                             stat = SelectionInfo.getDagPath(iInfluenceComponents, dagMesh, components);
  3648.                             if(MAYA_FAILED(stat))
  3649.                             {
  3650.                                 DXCC_DPF_ERROR(TEXT("Could not read DAG Path from SkinCluster  =SelectioInfo"));
  3651.                                 DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3652.                             }
  3653.                             else
  3654.                             {
  3655.                                 UINT iWeight = 0;
  3656.                                 MItGeometry itVertices(dagMesh, components);
  3657.                                 for (; !itVertices.isDone(); itVertices.next(), iWeight++)
  3658.                                 {
  3659.                                     FLOAT Weight= Weights[iWeight]; 
  3660.  
  3661.                                     for(DWORD iVertexD3D= MeshGlobal.VertexMayaToD3D[itVertices.index()].D3DFirstPointRep;
  3662.                                         iVertexD3D != UNUSED32;
  3663.                                         iVertexD3D= MeshGlobal.VertexD3DToMaya[iVertexD3D].D3DNextPointRep)
  3664.                                     {
  3665.                                         dxMesh->SetBoneInfluence(iBone, iVertexD3D, Weight);
  3666.                                     }
  3667.                                 }
  3668.                             }
  3669.                         }
  3670.                     }//END//WEIGHTS
  3671.                 }
  3672.             }
  3673.         }
  3674.     }
  3675.  
  3676.  
  3677. e_Exit:
  3678.     DXCC_RELEASE(dxMesh);
  3679.  
  3680.     DXCC_ASSERT_EXCEPTIONS_END()
  3681.  
  3682.     return hr;
  3683. }
  3684.  
  3685. HRESULT CMayaPreviewPipeline::Frame_GatherAnimation(DCCTag* pTag)
  3686. {
  3687.     HRESULT hr= S_OK;
  3688.     MStatus stat = MS::kSuccess;
  3689.  
  3690.     LPDXCCFRAME pFrame= NULL;
  3691.     LPDXCCANIMATIONSTREAM pAnim= NULL;
  3692.     if(!pTag)
  3693.         return E_FAIL;
  3694.  
  3695.     if(!pTag->Resource)
  3696.         return E_FAIL;
  3697.  
  3698.     if(pTag->Resource->GetIID() != IID_IDXCCFrame)
  3699.         return E_FAIL;
  3700.  
  3701.     if(!pTag->Interface)
  3702.         return E_FAIL;
  3703.  
  3704.     MDagPath dagTag= pTag->GetPath();
  3705.     MFnDependencyNode depNode(dagTag.node());
  3706.     MPlug matrixPlug= depNode.findPlug("matrix", &stat);//xformMatrix
  3707.     UINT minTick= (UINT)MAnimControl::minTime().as(MTime::uiUnit());
  3708.     UINT maxTick= (UINT)MAnimControl::maxTime().as(MTime::uiUnit());
  3709.     UINT cTicks= maxTick-minTick;
  3710.     UINT nFPS= MayaGetFPS();
  3711.  
  3712.     pFrame= (LPDXCCFRAME)pTag->Interface;
  3713.     pFrame->AddRef();
  3714.  
  3715.     hr= pFrame->GetLocalAnimation(&pAnim);
  3716.     if(DXCC_FAILED(hr))
  3717.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3718.  
  3719.     hr= pAnim->CreateTransformKeys(nFPS, D3DXPLAY_ONCE, cTicks);
  3720.     if(DXCC_FAILED(hr))
  3721.         DXCC_GOTO_EXIT(e_Exit, TRUE);
  3722.     
  3723.     for(UINT iTick= 0; iTick < cTicks; iTick++)
  3724.     {
  3725.         MObject matrixObject;
  3726.         DXCCKEY_MATRIX matrixKey;
  3727.         matrixKey.Time= (double)(minTick+iTick);
  3728.  
  3729.         MDGContext timeContext(MTime(matrixKey.Time, MTime::uiUnit()));
  3730.         stat= matrixPlug.getValue(matrixObject, timeContext);
  3731.  
  3732.         MFnMatrixData matrixData(matrixObject, &stat);
  3733.  
  3734.         ConvertLocalMatrix(matrixKey.Value, matrixData.matrix());
  3735.  
  3736.         hr= pAnim->SetTransformKeyAsMatrix(iTick, &matrixKey);
  3737.         if(DXCC_FAILED(hr))
  3738.             DXCC_GOTO_EXIT(e_Exit, TRUE);
  3739.  
  3740.     }
  3741.  
  3742. e_Exit:
  3743.     DXCC_RELEASE(pFrame);
  3744.     DXCC_RELEASE(pAnim);
  3745.     return hr;
  3746. }
  3747.  
  3748.  
  3749.  
  3750.  
  3751. //
  3752. //HRESULT 
  3753. //MayaMeshHierarchy::SceneAddAnimationFixedStep()
  3754. //{
  3755. //    HRESULT    hr = S_OK;
  3756. //    MStatus stat = MS::kSuccess;
  3757. //
  3758. //    //MAnimControl mAnimCtrl;
  3759. //    MTime mtTick, mtOriginalTime;
  3760. //    LONG nTicks;
  3761. //    LPDXCCFRAME pITFrame= NULL;
  3762. //    LPDXCCFRAMEITERATOR pIT = NULL;
  3763. //    DWORD nFPS= MayaGetFPS();
  3764. //
  3765. //    hr= DXCCCreateFrameIterator(&pIT);
  3766. //    if(DXCC_FAILED(hr))
  3767. //        DXCC_GOTO_EXIT(e_Exit, TRUE);
  3768. //
  3769. //    mtOriginalTime = MAnimControl::currentTime();
  3770. //
  3771. //    nTicks= (LONG)(MAnimControl::maxTime()-MAnimControl::minTime()).value()+1;
  3772. //
  3773. //    //Initialize frames
  3774. //    
  3775. //    for(pIT->Reset(pRoot, DXCCITERATOR_DEPTHFIRST), pIT->Next(); !pIT->Done(); pIT->Next())
  3776. //    {
  3777. //        LPFRAMEUSERDATA pFrameUD;
  3778. //
  3779. //        hr= pIT->Get(&pITFrame);
  3780. //        if(DXCC_FAILED(hr))
  3781. //            DXCC_GOTO_EXIT(e_Exit, TRUE);
  3782. //
  3783. //        pFrameUD= FrameGetUserData(pITFrame, pDXCCManager);
  3784. //
  3785. //        //if(MAnimUtil::isAnimated(pFrameUD->dagPath))
  3786. //        if(pFrameUD->dagPath.hasFn(MFn::kTransform))
  3787. //        {
  3788. //            
  3789. //            LPDXCCANIMATIONSTREAM pAnimation= NULL;
  3790. //            hr= pITFrame->GetLocalAnimation(&pAnimation);
  3791. //            if(DXCC_FAILED(hr))
  3792. //                DXCC_GOTO_EXIT(e_Exit, TRUE);
  3793. //
  3794. //            hr= pAnimation->CreateTransformKeys(nFPS, D3DXPLAY_ONCE, nTicks);
  3795. //            if(DXCC_FAILED(hr))
  3796. //                DXCC_GOTO_EXIT(e_Exit, TRUE);
  3797. //
  3798. //            DXCC_RELEASE(pAnimation);
  3799. //        }
  3800. //
  3801. //        DXCC_RELEASE(pITFrame);
  3802. //    }
  3803. //
  3804. //    for (mtTick = MAnimControl::minTime(); mtTick <= MAnimControl::maxTime(); mtTick += 1)
  3805. //    {
  3806. //        LONG iTick= (LONG)mtTick.value() - (LONG)MAnimControl::minTime().value();
  3807. //
  3808. //        stat= MAnimControl::setCurrentTime(mtTick);
  3809. //        if(MAYA_FAILED(stat))
  3810. //            DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3811. //
  3812. //        for(pIT->Reset(pRoot, DXCCITERATOR_DEPTHFIRST), pIT->Next(); !pIT->Done(); pIT->Next())
  3813. //        {
  3814. //            LPFRAMEUSERDATA pFrameUD;
  3815. //
  3816. //            hr= pIT->Get(&pITFrame);
  3817. //            if(DXCC_FAILED(hr))
  3818. //                DXCC_GOTO_EXIT(e_Exit, TRUE);
  3819. //            
  3820. //            pFrameUD= FrameGetUserData(pITFrame, pDXCCManager);
  3821. //            if(pFrameUD->dagPath.hasFn(MFn::kTransform))
  3822. //            {
  3823. //                hr= FrameAddAnimationFixedStep(iTick, pITFrame);
  3824. //                if(DXCC_FAILED(hr))
  3825. //                    DXCC_GOTO_EXIT(e_Exit, TRUE);
  3826. //            }
  3827. //
  3828. //            DXCC_RELEASE(pITFrame);
  3829. //        }
  3830. //    }
  3831. //
  3832. //e_Exit:
  3833. //    DXCC_RELEASE(pITFrame);
  3834. //    DXCC_RELEASE(pIT);
  3835. //
  3836. //    // reset current time
  3837. //    MAnimControl::setCurrentTime(mtOriginalTime);
  3838. //
  3839. //    return hr;
  3840. //}
  3841. //
  3842. //HRESULT 
  3843. //MayaMeshHierarchy::FrameAddAnimationFixedStep(
  3844. //    LONG iTick, 
  3845. //    LPDXCCFRAME _pFrame)
  3846. //{
  3847. //    HRESULT    hr = S_OK;
  3848. //    MStatus stat = MS::kSuccess;
  3849. //    MFnTransform fnTransform;
  3850. //    DXCCKEY_MATRIX KeyMatrix;
  3851. //    MMatrix MayaMatrix;
  3852. //    DWORD i, j;            // counters
  3853. //    LPDXCCANIMATIONSTREAM pAnimation= NULL;
  3854. //    DWORD nFPS= MayaGetFPS();
  3855. //    MDagPath FramePath;
  3856. //
  3857. //    LPFRAMEUSERDATA pFrameUD= FrameGetUserData(_pFrame, pDXCCManager);
  3858. //    //MDagPath::getAPathTo(pFrameUD->object, FramePath);
  3859. //    FramePath= pFrameUD->dagPath;
  3860. //
  3861. //    if(!FramePath.hasFn(MFn::kTransform))
  3862. //        DXCC_GOTO_EXIT( e_Exit, FALSE);
  3863. //
  3864. //    //if(MAnimUtil::isAnimated(pFrameUD->dagPath))
  3865. //    //    DXCC_GOTO_EXIT( e_Exit, FALSE);
  3866. //
  3867. //    hr= _pFrame->GetLocalAnimation(&pAnimation);
  3868. //    if(DXCC_SUCCEEDED(hr))
  3869. //    {
  3870. //        stat = fnTransform.setObject(FramePath);
  3871. //        if(MAYA_FAILED(stat))
  3872. //            DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3873. //
  3874. //
  3875. //        KeyMatrix.Time= (FLOAT)iTick;///(float)nFPS;
  3876. //
  3877. //        MayaMatrix= fnTransform.transformation().asMatrix();
  3878. //        for (i = 0; i < 4; i++)
  3879. //            for (j = 0; j < 4; j++)
  3880. //                KeyMatrix.Value[i * 4 + j]= (FLOAT)MayaMatrix(i, j);
  3881. //
  3882. //        hr= pAnimation->SetTransformKeyAsMatrix(iTick, &KeyMatrix);
  3883. //        if(DXCC_FAILED(hr))
  3884. //            DXCC_GOTO_EXIT(e_Exit, TRUE);
  3885. //    }
  3886. //
  3887. //e_Exit:
  3888. //    DXCC_RELEASE(pAnimation);
  3889. //    return hr;
  3890. //};
  3891. //
  3892. //
  3893. //HRESULT 
  3894. //MayaMeshHierarchy::SceneAddAnimationKeys()
  3895. //{
  3896. //    HRESULT    hr = S_OK;
  3897. //    MStatus stat = MS::kSuccess;
  3898. //    LPDXCCFRAME pITFrame= NULL;
  3899. //    LPDXCCFRAMEITERATOR pIT= NULL;
  3900. //    MAnimControl mAnimCtrl;
  3901. //
  3902. //    hr= DXCCCreateFrameIterator(&pIT);
  3903. //    if(DXCC_FAILED(hr))
  3904. //        DXCC_GOTO_EXIT(e_Exit, TRUE);
  3905. //
  3906. //
  3907. //    for(pIT->Reset(pRoot, DXCCITERATOR_DEPTHFIRST), pIT->Next(); !pIT->Done(); pIT->Next())
  3908. //    {
  3909. //        hr= pIT->Get(&pITFrame);
  3910. //        if(DXCC_FAILED(hr))
  3911. //            DXCC_GOTO_EXIT(e_Exit, TRUE);
  3912. //
  3913. //        hr= FrameAddAnimationKeys(pITFrame);
  3914. //        if(DXCC_FAILED(hr))
  3915. //            DXCC_GOTO_EXIT(e_Exit, TRUE);
  3916. //
  3917. //        DXCC_RELEASE(pITFrame);
  3918. //    }
  3919. //
  3920. //e_Exit:
  3921. //    DXCC_RELEASE(pITFrame);
  3922. //    DXCC_RELEASE(pIT);
  3923. //
  3924. //    return hr;
  3925. //}
  3926. //
  3927. //HRESULT 
  3928. //MayaMeshHierarchy::FrameAddAnimationKeys(
  3929. //    LPDXCCFRAME _pFrame)
  3930. //{
  3931. //    HRESULT    hr = S_OK;
  3932. //    MStatus stat = MS::kSuccess;
  3933. ////
  3934. ////    DWORD nFPS= MayaGetFPS();
  3935. ////    MAnimControl mAnimCtrl;
  3936. ////    MTime mtTick;
  3937. ////    MTime mtOriginalTime;
  3938. ////    MFnTransform fnTransform;
  3939. ////    MPlugArray AnimPlugs;
  3940. ////    UINT iPlug, iCurve, i, j;
  3941. ////    BOOL* rgbKeyedFrames;
  3942. ////    UINT iKey, nKeys, iTick, nTicks= (UINT)(MAnimControl::maxTime()-MAnimControl::minTime()).value()+1;
  3943. ////    MMatrix MayaMatrix;
  3944. ////    LPDXCCANIMATIONSTREAM pAnimation;
  3945. ////    MDagPath FramePath;
  3946. ////
  3947. ////    LPFRAMEUSERDATA pFrameUD= FrameGetUserData(_pFrame);
  3948. ////    //MDagPath::getAPathTo(pFrameUD->object, FramePath);
  3949. ////    FramePath= pFrameUD->dagPath;
  3950. ////
  3951. ////    if(MAnimUtil::isAnimated(pFrameUD->dagPath))
  3952. ////        DXCC_GOTO_EXIT( e_Exit, FALSE);
  3953. ////
  3954. ////    mtOriginalTime = mAnimCtrl.currentTime();
  3955. ////
  3956. ////    stat = fnTransform.setObject(FramePath);
  3957. ////    if(MAYA_FAILED(stat))
  3958. ////        DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3959. ////
  3960. ////    MAnimUtil::findAnimatedPlugs(FramePath, AnimPlugs, false, &stat);
  3961. ////    if(MAYA_FAILED(stat))
  3962. ////        DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3963. ////
  3964. ////    //COUNT AND FLAG THE KEYS
  3965. ////    //MAYA IS MORE COMPLICATED THAN SRT SO WE WILL JUST CAPTURE THE WHOLE MATRIX ON ANY KEY
  3966. ////    rgbKeyedFrames= (BOOL*)_alloca(sizeof(BOOL)*nTicks);
  3967. ////    nKeys= 0;
  3968. ////    for (nKeys= 0, iPlug = 0; iPlug < AnimPlugs.length(); iPlug++)
  3969. ////    {
  3970. ////        MObjectArray Curves;
  3971. ////
  3972. ////        MAnimUtil::findAnimation(AnimPlugs[iPlug], Curves, &stat);
  3973. ////        if(MAYA_FAILED(stat))
  3974. ////        {
  3975. ////            DXCC_DPF(TEXT("Ignoring anim-plug because could not find animation."));
  3976. ////            continue;
  3977. ////        }
  3978. ////
  3979. ////        for (iCurve = 0; iCurve < Curves.length(); iCurve++)
  3980. ////        {
  3981. ////            MFnAnimCurve fnCurve(Curves[iCurve], &stat);
  3982. ////            if(MAYA_FAILED(stat))
  3983. ////                DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3984. ////
  3985. ////            for (iKey = 0; iKey < fnCurve.numKeys(); iKey++)
  3986. ////            {
  3987. ////                MTime mtTime = fnCurve.time(iKey, &stat);
  3988. ////                if(MAYA_FAILED(stat))
  3989. ////                    DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
  3990. ////
  3991. ////                rgbKeyedFrames[(LONG)mtTime.value()]= TRUE;
  3992. ////                nKeys++;
  3993. ////            }
  3994. ////        }
  3995. ////    }
  3996. ////
  3997. ////    hr= DXCCCreateAnimationStreamForMatrices(nKeys, &pAnimation);
  3998. ////    if(DXCC_FAILED(hr))
  3999. ////        DXCC_GOTO_EXIT(e_Exit, TRUE);
  4000. ////
  4001. ////    hr= _pFrame->SetLocalAnimation(pAnimation);
  4002. ////    if(DXCC_FAILED(hr))
  4003. ////        DXCC_GOTO_EXIT(e_Exit, TRUE);
  4004. ////
  4005. ////    for(iKey= 0, iTick = 0; iTick < nTicks; iTick++)
  4006. ////    {
  4007. ////        if(rgbKeyedFrames[iTick] == TRUE)
  4008. ////        {
  4009. ////            LPDXCCKEY_MATRIX pKeyMatrix;
  4010. ////            hr= pAnimation->GetMatrix(iKey, &pKeyMatrix);
  4011. ////            if(DXCC_FAILED(hr))
  4012. ////                DXCC_GOTO_EXIT(e_Exit, TRUE);
  4013. ////
  4014. ////            pKeyMatrix->Time= iTick/(float)nFPS ;
  4015. ////
  4016. ////            MayaMatrix= fnTransform.transformation().asMatrix();
  4017. ////            for (i = 0; i < 4; i++)
  4018. ////                for (j = 0; j < 4; j++)
  4019. ////                    pKeyMatrix->Value[i * 4 + j]= (FLOAT)MayaMatrix(i, j);
  4020. ////
  4021. ////
  4022. ////            iKey++;
  4023. ////        }
  4024. ////    }
  4025. ////
  4026. ////e_Exit:
  4027. ////    DXCC_RELEASE(pAnimation);
  4028. ////    // reset current time
  4029. ////    mAnimCtrl.setCurrentTime(mtOriginalTime);
  4030. //
  4031. //    return hr;
  4032. //};
  4033.  
  4034.  
  4035.  
  4036.  
  4037.  
  4038.  
  4039.  
  4040.  
  4041.  
  4042.  
  4043.  
  4044.  
  4045.  
  4046.